QTimer不会调用超时槽

时间:2017-02-09 05:17:24

标签: c++ qt qt4 qthread qtimer

我试图在不同的QTimer内使用QThread,但我无法连接到QTimer的{​​{1}}广告位。

我做错了什么?

这是我的代码:

timeout()

2 个答案:

答案 0 :(得分:4)

这是因为您尝试从与创建它的线程不同的线程启动QTimer。使用QTimer和线程时,您应该非常小心地在将控制它的线程中创建QTimer。

来自QTimer class documentation

  

在多线程应用程序中,您可以在任何具有事件循环的线程中使用QTimer。要从非GUI线程启动事件循环,请使用QThread :: exec()。 Qt使用计时器的线程亲和性来确定哪个线程将发出timeout()信号。因此,你必须在其线程中启动和停止计时器;无法从另一个线程启动计时器。

在你的情况下,percentTimer = new QTimer();是从主线程执行的(尽管之前你使用过moveToThread,这仍然是执行它的主线程),而你的doWork和{{ 1}}信号从start发出。

例如,您可以从workerThread调用的new QTimer广告位中而不是在构造函数中执行void init(),以确保创建并拥有workerThread通过适当的线程。

QTimer

答案 1 :(得分:1)

首先,您应该设置workerThreadmyObj在其上下文中工作(在创建所需连接后启动,因为连接到start信号的插槽可能不会被执行否则)。 而不是使用QThread::sleepFor,你应该使用这样的东西:

QEventLoop loop;
QTimer::singleShot(60000, &loop, SLOT(exit()));
loop.exec();

创建延迟,因为QThread::sleepFor冻结整个线程执行。因此,没有任何事件会被处理到这个线程。

workerThread.exec()在这里毫无用处。