QT中QThread用法测试

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()
{

}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值