2 つの異なるボタンを押すと、スレッドを開始/停止する必要があります。
私のコードが正しいかどうかを提案してください。connect() 呼び出しで何か見逃していますか?
Problem
私が直面しているのは、スレッドで quit() を呼び出した後、スレッドが終了するのを待ちますが、スレッドで wait() 呼び出しnever returns true
、および私のprogram is stuck in
, while(!m_deviceThread.wait())
これを解決する方法を提案してください。
Mainwindow クラスで定義された私の devicethread & worker オブジェクト:--
QThread m_deviceThread;
deviceThreadObject *m_deviceThreadObject;
メイン デバイス スレッド オブジェクト :-----
class deviceThreadObject : public QObject
{
Q_OBJECT
public:
explicit deviceThreadObject(QObject *parent = 0);
/*!
Termination control main thread
*/
bool m_bQuit;
signals:
public slots:
void dowork();
};
deviceThreadObject オブジェクト コンストラクター:--
// constructor for the deviceThreadObject
deviceThreadObject::deviceThreadObject(QObject *parent) :
QObject(parent)
{
m_bQuit = false;
}
m_deviceThread
ボタンの開始が押されたときに実行されるメインスレッドがあります:---
void MainWindow::on_actionStart_triggered()
{
if(!b_threadAlreadyStarted)
{
m_deviceThreadObject = new deviceThreadObject;
// connect device thread signal to the slot
connect(&m_deviceThread ,SIGNAL(started()),m_deviceThreadObject,SLOT(dowork()));
m_deviceThreadObject->moveToThread(&m_deviceThread);
// Set the flag before starting slot of main thread
m_deviceThreadObject->m_bQuit = true;
m_deviceThread.start();
}
}
m_deviceThread
ボタンストップが押されたときに停止するメインスレッドがあります:---
void MainWindow::on_actionStop_triggered()
{
if(b_threadAlreadyStarted)
{
b_threadAlreadyStarted = false;
// get out of event loop
m_deviceThreadObject->m_bQuit = false;
m_deviceThread.quit();
qDebug() << " \n quit ";
// wait for thread to terminate
while(!m_deviceThread.wait());
m_deviceThreadObject->deleteLater();
qDebug() << " \n finished";
}
}
// デバイスの共通スロット - スレッド
void deviceThreadObject::dowork()
{
while(m_bquit)
{
// Do some work
}
}