QT中QThread的movetoThread用法测试
一、movetoThread用法说明
QThread是QT中关于线程的类。这个类一般有两个用法,一个是派生QThread类的一个子类并重载其中的run函数;另一个是派生QObject类的子类并在里面新建操函数,通过moveToThread函数将其作用到QTread类的对象中。但是信号与槽的连接方式不同,则槽函数运行所在的线程不同。本文简单测试moveToThread函数的用法。
二、测试摘要
本测试程序共需要ThreadTest和ChildThreadObj两个类。
在Qt4.8中新建一个基于QMainWindow的GUI程序,工程名为ThreadTest。新建一个基于QObject的类,名为ChildThreadObj。
在主类ThreadTest中新建一个线程类QThread对象和ChildThreadObj类对象,并将后者通过movetoThread函数作用于前者。
在主类ThreadTest中新建一个信号,在ChildThreadObj类中新建一个槽函数,并在主类中通过connect函数将信号与槽连接,连接方式可选择不同方式。在主类函数中发送一个信号,可观察子类中槽函数打印线程ID是否与主线程是否相同。
三、结论
若定义发射信号所在的线程为主线程,槽函数所在类通过movetoThread函数作用到的线程为子线程,则得到结论如下:
(1)如果是Qt::QueuedConnection连接方式,则槽函数showMessage是在子线程运行,即movetoThread所在线程;
(2)如果是Qt::DirectConnection连接方式,则槽函数showMessage是在主线程运行,即信号所在线程运行。
###四、代码实现
子类ChildThreadObj代码如下:
class ChildThreadObj : public QObject
{
Q_OBJECT
public:
ChildThreadObj(QObject *parent);
~ChildThreadObj();
private:
public slots:
void showMessage();
};
#endif // CHILDTHREADOBJ_H
子类函数实现代码如下:
ChildThreadObj::ChildThreadObj(QObject *parent)
: QObject(parent)
{
}
ChildThreadObj::~ChildThreadObj()
{
}
void ChildThreadObj::showMessage()
{
qDebug() << "slotfuncChildThread ThreadID:" << QThread::currentThreadId();
}
主类代码如下:
class ThreadTest : public QMainWindow
{
Q_OBJECT
public:
ThreadTest(QWidget *parent = 0, Qt::WFlags flags = 0);
~ThreadTest();
protected:
private:
Ui::QThreadTestClass ui;
ChildThreadObj *childthreadobj;
QThread *childthread;
public slots:
signals:
void requested();
};
主类函数的实现代码如下:
ThreadTest::ThreadTest(QWidget *parent, Qt::WFlags flags)
: QMainWindow(parent, flags)
{
ui.setupUi(this);
qDebug() << "mainwindow ThreadID:" << QThread::currentThreadId();
childthreadobj = new ChildThreadObj(NULL);
childthread = new QThread;
childthreadobj->moveToThread(childthread);
childthread->start();
//**********如果是Qt::QueuedConnection连接方式,则槽函数showMessage是在子线程运行
connect(this, SIGNAL(requested()), childthreadobj, SLOT(showMessage()), Qt::QueuedConnection);
//**********如果是Qt::DirectConnection连接方式,则槽函数showMessage是在主线程运行
//connect(this, SIGNAL(requested()), childthreadobj, SLOT(showMessage()), Qt::DirectConnection);
emit requested();
}
ThreadTest::~ThreadTest()
{
}