我试图在不同的QTimer
内使用QThread
,但我无法连接到QTimer
的{{1}}广告位。
我做错了什么?
这是我的代码:
timeout()
答案 0 :(得分:4)
这是因为您尝试从与创建它的线程不同的线程启动QTimer。使用QTimer和线程时,您应该非常小心地在将控制它的线程中创建QTimer。
在多线程应用程序中,您可以在任何具有事件循环的线程中使用QTimer。要从非GUI线程启动事件循环,请使用QThread :: exec()。 Qt使用计时器的线程亲和性来确定哪个线程将发出timeout()信号。因此,你必须在其线程中启动和停止计时器;无法从另一个线程启动计时器。
在你的情况下,percentTimer = new QTimer();
是从主线程执行的(尽管之前你使用过moveToThread
,这仍然是执行它的主线程),而你的doWork
和{{ 1}}信号从start
发出。
例如,您可以从workerThread
调用的new QTimer
广告位中而不是在构造函数中执行void init()
,以确保创建并拥有workerThread
通过适当的线程。
QTimer
答案 1 :(得分:1)
首先,您应该设置workerThread
让myObj
在其上下文中工作(在创建所需连接后启动,因为连接到start
信号的插槽可能不会被执行否则)。
而不是使用QThread::sleepFor
,你应该使用这样的东西:
QEventLoop loop;
QTimer::singleShot(60000, &loop, SLOT(exit()));
loop.exec();
创建延迟,因为QThread::sleepFor
冻结整个线程执行。因此,没有任何事件会被处理到这个线程。
workerThread.exec()
在这里毫无用处。