大佬教程收集整理的这篇文章主要介绍了c – 是否可以使用QThread实现轮询而无需对其进行子类化?,大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
class Device { public: ... void Start(); void Stop(); void MsgLoop(); signals: void sMsgArrived(); }
从GUI线程调用Start()和Stop(). Start()开始运行MsgLoop()的新线程.它看起来像这样:@H_262_10@
void MsgLoop() { forever { if(succesS == ReadMsg()) //synchronous,non-blocking { ProcessMsg(); //quite fast emit sMsgArrived(); //this signal is connected with a slot in GUI thread } } }
当调用Stop()时,程序应该从MsgLoop()返回并停止该线程.如何在没有子类化的情况下使用QThread实现它?@H_262_10@
class Device : QObject { Q_OBjeCT public: Device(QObject * parent = null); void Start(); void Stop(); private slots: void MsgLoop(); signals: void sMsgArrived(); private: QThread thread; bool stopThread; }; Device::Device(QObject * parent) : QObject(parent) { moveToThread(&thread); connect(&thread,SIGNAL(started()),this,SLOT(MsgLoop())); } void Device::Start() { stopThread = false; thread.start(); } void Device::Stop() { stopThread = true; thread.wait(); // if you want synchronous stop } void Device::MsgLoop() { // your loop while(!stopThread) if(succesS == ReadMsg()) { ProcessMsg(); emit sMsgArrived(); } QThread::currentThread->quit(); }
注意:只有在ReadMsg确实是非阻塞的情况下,线程停止才有效.如果你以后决定切换到阻塞读取(这可能适用于大多数情况),你将不得不找到另一种方法来阻止你的线程.@H_262_10@
以上是大佬教程为你收集整理的c – 是否可以使用QThread实现轮询而无需对其进行子类化?全部内容,希望文章能够帮你解决c – 是否可以使用QThread实现轮询而无需对其进行子类化?所遇到的程序开发问题。
如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。
本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。