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】