qt qthead里如何响应信号_解析Qt中QThread使用方法(2)

run中信号与QThread中槽

定义一个 Dummy 类,在run中发射它的信号

也可以在run中发射 Thread 中的信号,而不是Dummy(效果完全一样),QThread 定义槽函数,重载run函数

/*!

* \file main.cpp

*

* Copyright (C) 2010, dbzhang800

* All rights reserved.

*

*/

#include

#include

#include

#include

class Dummy:public QObject {

Q_OBJECT public:     Dummy(QObject*parent=0):QObject(parent){}

public slots: oid emitsig()

{  emit sig();

} signals:     void sig(); };

class Thread:public QThread {

Q_OBJECT public:

Thread(QObject*parent=0):QThread(parent) { //moveToThread(this); }

public slots:     void slot_thread()     {

qDebug()<

signals:     void sig(); protected:     void run()     {

qDebug()<

Dummy dummy;

connect(&dummy, SIGNAL(sig()), this, SLOT(slot_thread()));

dummy.emitsig();         e

xec();

}

};

#include "main.moc"  int main(int argc, char *argv[]) {

QCoreApplication a(argc, argv);

qDebug()<

Thread thread;

thread.start();

return a.exec(); }

想看结果么?

main thread: 0x15c0 thread thread: 0x1750 from thread slot_thread: 0x15c0

其实没悬念,肯定是主线程

thread 对象本身在主线程。所以它的槽也在要在主线程执行,如何解决呢?

(方法一)前面提了 moveToThread,这儿可以用,而且可以解决问题。当同样,是被批判的对象。

(方法二)注意哦,这儿我们的信号时次线程发出的,对比connect连接方式,会发现:

采用直接连接,槽函数将在次线程(信号发出的线程)执行

这个方法不太好,因为你需要处理slot和它的对象所在线程的同步。需要 QMutex 一类的东西

推荐的方法,其实,这个方法太简单,太好用了。定义一个普通的QObject派生类,然后将其对象move到QThread中。使用信号和槽时根本不用考虑多线程的存在。也不用使用QMutex来进行同步,Qt的事件循环会自己自动处理好这个。

/*!

* \file main.cpp

*

* Copyright (C) 2010, dbzhang800

* All rights reserved.

*

*/

#include

#include

#include

#include

class Dummy:public QObject {

Q_OBJECT

public:     Dummy(QObject*parent=0):QObject(parent)     {}

public slots:     void emitsig()     {         emit sig();

} signals:     void sig(); };

class Object:public QObject {

Q_OBJECT

public: Object(){} public slots:void slot() {

qDebug()<

}

};

#include "main.moc"  int main(int argc, char *argv[]) {

QCoreApplication a(argc, argv);

qDebug()<

QThread thread;

Object obj;

Dummy dummy;

obj.moveToThread(&thread);

QObject::connect(&dummy, SIGNAL(sig()), &obj, SLOT(slot()));

thread.start();

dummy.emitsig();

return a.exec(); }

结果:恩,slot确实不在主线程中运行(这么简单不值得欢呼么?)

main thread: 0x1a5c from thread slot: 0x186c

小结:Qt中QThread使用方法,讲到这里。在本文中多次提到线程,那么对于QThread类,它提供了与系统无关的线程。QThread代表在程序中一个单独的线程控制,在多任务操作系统中,它和同一进程中的其它线程共享数据,但运行起来就像一个单独的程序一样。它不是在main()中开始,QThread是在run()中开始运行的。

【编辑推荐】

【责任编辑:李程站 TEL:(010)68476606】

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值