我有一个类,它是某些设备的抽象。
class Device
{
public:
...
void Start();
void Stop();
void MsgLoop();
signals:
void sMsgArrived();
}
Start() 和 Stop() 从 GUI 线程调用。 Start() 开始新线程,该线程运行 MsgLoop()。它看起来像这样:
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 来实现它而不需要子类化它?
一般来说,您必须决定谁将负责管理线程。是设备还是主窗口?或者可能是一些设备管理器。在您的情况下,设备可能应该管理自己的线程,因此如果您不想子类化它,请使用组合:
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
确实是非阻塞的。如果您稍后决定切换到阻塞读取(这可能适合大多数情况),您将不得不找出另一种方法来停止线程。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)