我在GUI应用程序中执行一些非常耗时的任务,我希望它们是线程化的,这样就不会冻结我的GUI ..
为此,我创建了一个线程,并启动了一个计时器。我在我的线程的“run”方法中将来自我的计时器的timeout()方法连接到我想要解析的耗时函数,但是当调用信号时,在主线程中调用耗时的函数而不是我创造的那个。
这是我的代码,简化了示例:
void MyThread::run()
{
m_pTimer = new QTimer()
connect(m_pTimer, SIGNAL(timeout()), this, SLOT(timeConsumingMethod()));
m_pTimer->start(x);
}
我在MyThread :: run()和my main中的“timeConsumingMethod”中打印了静态方法QThread :: currentThread()的值,其值与我的主中的值相同。
如何让我的函数在分离的线程中运行?更重要的是为什么我的代码错了?
答案 0 :(得分:0)
“你做错了。” :)
试试这个:
myworker.h
#include ...
class MyWorker : public QObject {
Q_OBJECT
public:
explicit MyWorker(QObject* parent = 0);
public slots:
void timeConsumingMethod();
}
myworker.cpp
#include "myworker.h"
#include ...
MyWorker::MyWorker(QObject* parent) :
QObject(parent)
{
/*
...
*/
}
void MyWorker::timeConsumingMethod() {
/*
...
*/
}
码
/*...*/
MyWorker* worker = new MyWorker();
QThread* workerThread = new QThread();
QTimer* timer = new QTimer();
worker->moveToThread(workerThread);
worker->connect(timer, SIGNAL(timeout()), SLOT(timeConsumingMethod()));
// don't forget proper obj deletion
// not the best way, but...
worker->connect(workerThread, SIGNAL(destroyed()), SLOT(deleteLater());
workerThread->start();
timer->start(x);
在那种情况下,worker将“live”在workerThread中。 QT SIGNAL-SLOT机制支持不同线程中对象之间的连接。
通过重新实现run()方法和QThread继承,这种方法比“程序方式”要好得多worker work,QThread控制线程