QThread:在正确的线程中调用信号

时间:2013-04-19 06:04:17

标签: multithreading qt qthread qtimer

我在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()的值,其值与我的主中的值相同。

如何让我的函数在分离的线程中运行?更重要的是为什么我的代码错了?

1 个答案:

答案 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控制线程

来源:http://qt-project.org/wiki/Threads_Events_QObjects