何时使用QThread :: exec()

时间:2010-10-07 02:00:18

标签: c++ multithreading qt

我检查了一个令人满意的解释,但找不到。通常文档提到为了在线程之间使用信号/槽,我们需要使用事件循环并通过调用exec来启动它们。

但是我可以看到没有使用exec(),我仍然可以发送信号并跨线程处理它们。

它的确切用途是什么?

2 个答案:

答案 0 :(得分:3)

如果要运行事件循环,请使用QThread::exec() Qt在QThread类中为您提供。如果不调用exec(),则需要创建自己的事件循环来处理Qt事件(即,如果您希望信号/插槽工作)。除非你有非常具体的需求,否则这几乎肯定比它的价值更多。

你说你还可以发送信号/插槽吗?我的猜测是你实际上并没有在不同的线程上运行任何东西。使用QThread时这是一个非常常见的问题。在您认为在不同线程上运行的代码中放置一个断点并查看堆栈跟踪 - 您可能会感到震惊!

答案 1 :(得分:2)

一个粗略的例子。

假设您有一个文本框。在每个字母上,用户键入要执行某些后台任务的文本框。您可以为此设置QThread。只要文本框的内容发生变化,就会发送内容。从处理后台任务的QThread分配一个插槽。任务完成后,从QThread发出一些东西。从主线程处理此信号。连接他们。创建文本框时(或任何适当的时间)启动线程。如果您从exec()致电QThread::run(),那么您不需要多次start()该主题。

如果您不使用此机制,则每次文本框内容更改时,您可能需要创建(和/或start()QThread,执行后台任务并获得结果。这次你仍然可以在主线程和这个线程之间使用信号/槽,但你需要多次start()线程。