4

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

  }

}
4

1 に答える 1