C&C++   发布时间:2022-04-03  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了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@

解决方法

@H_404_24@ 通常,您必须决定由谁来负责管理线程.它是设备还是主窗口?或者可能是一些设备管理员在您的情况下,设备应该可以管理自己的线程,因此如果您不想将其子类化,请使用组合:

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,请注明来意。