0

我有一些非常耗时的任务要在 GUI 应用程序中执行,我希望它们被线程化,这样它就不会冻结我的 GUI ..

为此,我创建了一个线程,并启动了一个计时器。我在我的线程的“运行”方法中将timeout()方法从我的计时器连接到我想要并行化的耗时函数,但是当调用信号时,会在主线程中调用耗时函数我创建的那个。

这是我的代码,为示例简化:

void MyThread::run()
{
   m_pTimer = new QTimer()
   connect(m_pTimer, SIGNAL(timeout()), this, SLOT(timeConsumingMethod()));
   m_pTimer->start(x);
}

我在“timeConsumingMethod”、MyThread::run() 和我的 main 中打印了静态方法 QThread::currentThread() 的值,它的值与我的 main 中的值相同。

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

4

1 回答 1

0

“你这样做是错的。” :)

尝试这个:

我的工人.h

#include ...

class MyWorker : public QObject {
   Q_OBJECT
public:
   explicit MyWorker(QObject* parent = 0);
public slots:
   void timeConsumingMethod();
}

我的工人.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 将“生活”在 workerThread 中。QT SIGNAL-SLOT 机制支持不同线程中对象之间的连接。

通过重新实现 run() 方法和 QThread 继承,这种方法比“程序方式”要好得多

worker 工作,QThread 控制线程

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

于 2013-04-19T12:02:52.790 回答