当前位置: 代码迷 >> QT开发 >> QT下多线程通信解决思路
  详细解决方案

QT下多线程通信解决思路

热度:326   发布时间:2016-04-25 05:09:23.0
QT下多线程通信
我现在在做QT的电子点菜系统,遇到个问题,就是我在服务端主函数里面创建了个QWidget对象,用来显示管理界面,然后又创建了一个子线程用来创建套接字并监听接受客户端发送的数据。现在的问题是我想在客户端发送数据过来并且服务端收到数据后在服务端弹出一个消息框提示有客户点菜,结果运行程序并点菜出现“QPixmap: It is not safe to use pixmaps outside the GUI thread”这种提示,并且整个程序卡死。我去查过说是在子线程中不能使用QT的QMessageBox类。求解。。。。

------解决方案--------------------
去看下qt 多线程重入、线程安全
qt 助手 
Reentrancy and Thread-Safety
Thread-Support in Qt Modules -> Painting in Threads
QPainter can be used in a thread to paint onto QImage, QPrinter, and QPicture paint devices. Painting onto QPixmaps and QWidgets is not supported. 
Any number of threads can paint at any given time, however only one thread at a time can paint on a given paint device. In other words, two threads can paint at the same time if each paints onto separate QImages, but the two threads cannot paint onto the same QImage at the same time.
多线程绘制有限制


或者看书 《C++ GUI Qt 4编程》 第14章 多线程 这章,
------解决方案--------------------
子线程里不能创建和显示qgui的东西
QGUI的类必须和QcoreApplication在一个线程
可以在子线程里调用界面线程的一个方法
然后由该方法emit signal
然后界面线程的slot去处理
------解决方案--------------------
ls说的对 只有主线程操作ui才是安全的 子线程必须emit信号给主线程 或者postevent到消息队列才能更新ui
------解决方案--------------------
归根结底一句话:对UI的操作只能放在UI主线程中,不能在子线程中处理。
------解决方案--------------------

这个只是关联signal与slot,你只有在其他地方调用emit changeText(PEOPLE),才会发出这个信号。

探讨

各位都说的很在理,书我也看了,确实是这个这样的, 可是还是有疑问,各位可以帮我解释下这句话吗connect(mythread,SIGNAL(changeText(PEOPLE)),this,SLOT(labelSetText(PEOPLE)),Qt::QueuedConnection); 我从网上看到的,也是用信号和槽来和主线程通信,这个信号是在mythread对象创建的时候就发送吗?
……

------解决方案--------------------
探讨

各位都说的很在理,书我也看了,确实是这个这样的, 可是还是有疑问,各位可以帮我解释下这句话吗connect(mythread,SIGNAL(changeText(PEOPLE)),this,SLOT(labelSetText(PEOPLE)),Qt::QueuedConnection); 我从网上看到的,也是用信号和槽来和主线程通信,这个信号是在mythread对象创建的时候就发送吗?
……
  相关解决方案