Refrence By:
http://www.cppblog.com/bitdewy/archive/2012/05/28/176553.html;
http://mobile.51cto.com/symbian-268690.htm;
更详细的深入讲解见参考:
最近遇到跨线程间信号槽的使用,终于找到一个较理想的解决方案,后续再深入学习其中的事件循环相关,这地方个人觉得才是信号槽或跨线程的精髓!
进入正题:
一般会遇到这样的问题,即在主线程中有些东西不方便处理,需要交给次级线程,这地方就需要用到信号槽机制,
connect(this,SIGNAL(),&thread,SLOT());
但是通常会遇到的问题是,sender和reciver的线程依附性一般都是相同的,该怎么处理呢?百思不得其解,没想到解决方案如此简单,就是将主线程不方便处理的
工作交给QObject的一个子类Child,然后将Child的线程依附性改变,类似如下:
Child::QObject
{
public slots:
dowork(){};
}
thread::QThread()
{
}
然后,Child.moveToThread(&thread);
各种玄机,请看代码
//mytest.h
#include <QtCore/QCoreApplication>
#include <QtCore/QObject>
#include <QtCore/QThread>
#include <QtCore/QDebug>
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()<<"from thread slot:" <<QThread::currentThreadId();
}
};
//main.cpp
#include "mytest.h"
int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv);
qDebug()<<"main thread:"<<QThread::currentThreadId();
QThread thread;
Object obj;
Dummy dummy;
obj.moveToThread(&thread);
QObject::connect(&dummy, SIGNAL(sig()), &obj, SLOT(slot()));
thread.start();
dummy.emitsig();
return a.exec();
}
结果:
main thread: 0x1094
from thread slot: 0x1498
OK,今天先到这里,其中还有许多不明白的地方,以后有机会再写!!