【发布时间】:2010-10-12 12:32:42
【问题描述】:
有一段时间,我现在很烦在响应良好的 UI 后面运行大量时间/cputime 消耗操作。不幸的是,我似乎无法让它运行,“我认为”问题是插槽不是在 QThread 工作线程中处理的,而是在 GUI 线程中处理的。 ThreadID 与预期的不同。
我已经读过这个http://doc.trolltech.com/4.6/threads-qobject.html 并使用了 googel 和 SO 搜索,但没有什么真正帮助我。可能是我看不到的顽固。
以下是我的精简代码(注意:在二进制文件所在的文件夹中需要一个名为“dummy1024x1024.png”的 png):
main.cpp
#include <QtGui>
#include "dummy.h"
int main(int argc, char** argv)
{
QApplication app(argc, argv);
Dummy d(NULL);
d.show();
qDebug() << "App thread " << QThread::currentThreadId();
return app.exec();
}
dummy.h
#ifndef DUMMY_H
#define DUMMY_H
#include <QWidget>
#include <QVBoxLayout>
#include <QPushButton>
#include "workerthread.h"
class Dummy : public QWidget
{
Q_OBJECT
public:
explicit Dummy(QWidget *parent = 0);
virtual ~Dummy();
private:
QVBoxLayout* m_layout;
QPushButton* m_dummy[3];
QPushButton* m_shootcalc;
WorkerThread* m_work;
signals:
public slots:
};
#endif // DUMMY_H
dummy.cpp
#include "dummy.h"
Dummy::Dummy(QWidget *parent) :
QWidget(parent)
{
m_work = new WorkerThread(this);
m_work->start();
m_shootcalc = new QPushButton("Calc!", this);
connect(m_shootcalc, SIGNAL(clicked()), m_work, SLOT(expensiveCalc()), Qt::QueuedConnection);
m_dummy[0] = new QPushButton("Dummy [0]", this);
m_dummy[1] = new QPushButton("Dummy [1]", this);
m_dummy[2] = new QPushButton("Dummy [2]", this);
m_layout = new QVBoxLayout(this);
m_layout->addWidget(m_shootcalc);
m_layout->addWidget(m_dummy[0]);
m_layout->addWidget(m_dummy[1]);
m_layout->addWidget(m_dummy[2]);
setLayout(m_layout);
}
Dummy::~Dummy()
{
m_work->quit();
m_work->wait();
m_work->deleteLater();
m_work = NULL;
}
workerthread.h
#ifndef WORKERTHREAD_H
#define WORKERTHREAD_H
#include <QThread>
#include <QPixmap>
#include <QDebug>
class WorkerThread : public QThread
{
Q_OBJECT
public:
explicit WorkerThread(QObject *parent = 0);
protected:
virtual void run();
signals:
public slots:
void expensiveCalc();
};
#endif // WORKERTHREAD_H
workerthread.cpp
#include "workerthread.h"
WorkerThread::WorkerThread(QObject *parent) :
QThread(parent)
{
}
void WorkerThread::run()
{
qDebug() << "Thread start << " << QThread::currentThreadId();
exec();
qDebug() << "Thread stop << " << QThread::currentThreadId();
}
void WorkerThread::expensiveCalc()
{
qDebug() << "start pixie loading.... " << QThread::currentThreadId();
QPixmap* pixies[16384];
for (int i=0; i<16384; ++i)
{
pixies[i] = new QPixmap("./dummy1024x1024.png");
if (i>0)
delete pixies[i-1];
msleep(1);
}
delete pixies[16384-1];
qDebug() << "loaded pixies " << QThread::currentThreadId();
qDebug() << "";
qDebug() << "";
qDebug() << "";
qDebug() << "";
}
感谢任何帮助/提示/回复
【问题讨论】:
-
不久前在德国的“Linux Magazin”中有一篇关于这个问题的文章。并且在 github 上有一些代码可用于工作线程,这些代码可以与信号/插槽一起正常工作。见这里:github.com/picaschaf/Qt-Worker-Thread这可能就是你要找的。span>
-
感谢您提供的信息,我通常阅读 LinuxMagazine,但似乎错过了。我根据 Qt 文档和示例告诉我的内容完成了上述代码。不幸的是,QThread 文档是 Qt 文档中最糟糕的部分之一。
标签: multithreading qt qt4