本文主要是介绍Qt多线程 - moveToThread(实现信号与槽不同源),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
以下内容转自:Qt 的线程与事件循环——可打印threadid进行观察槽函数到底是在哪个线程里执行,学习moveToThread的使用)
文章中主要讨论了Qt中信号、槽、用户线程与主线程的关系及使用结果
文中最后给出了一种比较好的多线程方式,用作者的话来说:“ 其实,这个方法太简单,太好用了。定义一个普通的QObject派生类,然后将其对象move到QThread中。使用信号和槽时根本不用考虑多线程的存在。也不用使用QMutex来进行同步,Qt的事件循环会自己自动处理好这个。”
/*!
* \file main.cpp
*
* Copyright (C) 2010, dbzhang800
* All rights reserved.
*
*/
#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(); }
}; #include "main.moc" 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();
}
结果:恩,slot确实不在主线程中运行(这么简单不值得欢呼么?)
main thread: 0x1a5c
from thread slot: 0x186c
这篇关于Qt多线程 - moveToThread(实现信号与槽不同源)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!