我正在尝试在特定线程中启动QTimer。但是,计时器似乎没有执行,也没有打印出任何内容。这是与计时器,插槽或线程有关吗?
main.cpp
#include "MyThread.h"
#include <iostream>
using namespace std;
int main(int argc, char *argv[]) {
MyThread t;
t.start();
while(1);
}
MyThread.h
#ifndef MYTHREAD_H
#define MYTHREAD_H
#include <QTimer>
#include <QThread>
#include <iostream>
class MyThread : public QThread {
Q_OBJECT
public:
MyThread();
public slots:
void doIt();
protected:
void run();
};
#endif /* MYTHREAD_H */
MyThread.cpp
#include "MyThread.h"
using namespace std;
MyThread::MyThread() {
moveToThread(this);
}
void MyThread::run() {
QTimer* timer = new QTimer(this);
timer->setInterval(1);
timer->connect(timer, SIGNAL(timeout()), this, SLOT(doIt()));
timer->start();
}
void MyThread::doIt(){
cout << "it works";
}
6条答案
按热度按时间xienkqul1#
正如我对you are doing it wrong的评论:
1.您正在将保存线程数据的对象与另一个对象(负责
doIt()
)混合在一起。他们应该分开。1.在你的例子中没有必要子类化
QThread
。更糟糕的是,您正在重写run
方法,而没有考虑它在做什么。这部分代码应该足够了
现在(Qt版本>=5)默认情况下,
QThread
在其run()
方法中启动一个事件循环。为了在线程中运行,你只需要移动对象。Read the doc...wnvonmuf2#
a2mppw5e3#
QTimer
只能在有事件循环的线程中工作。http://qt-project.org/doc/qt-4.8/QTimer.html
在多线程应用程序中,您可以在任何具有事件循环的线程中使用QTimer。要从非GUI线程启动事件循环,请使用QThread::exec()。Qt使用计时器的线程关联来确定哪个线程将发出timeout()信号。正因为如此,您必须在其线程中启动和停止计时器;不可能从另一个线程启动计时器。
csbfibhn4#
您可以使用emit信号并在emitted slot函数中启动计时器
main.cpp
MyThread.h
MyThread.cpp
ssgvzors5#
你需要一个事件循环来拥有计时器。下面是我如何用我的代码解决同样的问题:
以下是其他海报都没有提到的相关文档:
int QCoreApplication::exec()**
进入主事件循环并等待直到调用exit()。返回设置为exit()的值(如果通过quit()调用exit(),则为0)。需要调用此函数来启动事件处理。主事件循环接收来自窗口系统的事件并将这些事件分派给应用程序小部件。要使应用程序执行空闲处理(即执行一个特殊的功能,每当有没有挂起的事件),使用QTimer与0超时。使用processEvents()可以实现更高级的空闲处理方案。
0tdrvxhp6#
我创建了一个在lambda函数中调用计时器的示例: