我检查了令人满意的解释,但无法找到。通常文档提到为了在线程之间使用信号/插槽,我们需要使用事件循环并通过调用exec来启动它们。何时使用QThread :: exec()
但是我可以看到使用exec()的w/o,我仍然可以发送信号并通过线程处理它们。
它的确切用途是什么?
我检查了令人满意的解释,但无法找到。通常文档提到为了在线程之间使用信号/插槽,我们需要使用事件循环并通过调用exec来启动它们。何时使用QThread :: exec()
但是我可以看到使用exec()的w/o,我仍然可以发送信号并通过线程处理它们。
它的确切用途是什么?
使用QThread::exec()
当你想运行事件循环Qt为你提供的QThread类。如果你不调用exec(),你需要创建你自己的处理Qt事件的事件循环(也就是说,如果你想让信号/插槽工作)。除非您有非常特殊的需求,否则这几乎肯定会比其值得的工作更多。
你说你仍然可以发送信号/插槽?我的猜测是,你实际上并没有在不同的线程上运行任何东西。使用QThread时,这是一个非常常见的问题。在你认为正在另一个线程上运行的代码中放置一个断点并查看堆栈跟踪 - 您可能会感到震惊!
一个粗略的例子。
假设您有一个文本框。在您要执行一些后台任务的文本框上的每个字母用户类型上。您可以为此设置一个QThread
。每当文本框内容发生变化时就会发出一些东西。从您的QThread
指定一个处理后台任务的插槽。任务完成时从QThread
发出一些东西。从主线程处理此信号。连接它们。在创建文本框(或任何适当的时间)时启动线程。如果您从QThread::run()
拨打exec()
,那么您不需要start()
线程多次。
如果您不使用此机制,则每次文本框内容更改时,您可能需要创建(和/或start()
)QThread
,执行后台任务并获取结果。这次您仍然可以在主线程和此线程之间使用信号/插槽,但您需要多次线程。
也许你只是在没有exec()的情况下从线程发送信号,并在带有事件循环(例如主线程)的线程中接收它们。这总是有效的。 – 2010-10-07 05:53:14
你好,你可以发布两个运行线程的示例代码。 – 2011-02-28 13:17:08