Я должен начать/остановить поток при нажатии двух разных кнопок.
Пожалуйста, предложите мой код правильно или нет. Я пропустил что-то в вызове connect()?Как остановить поток - Qthread
Problem
я столкнулся в том, что после вызова выхода() на моей теме, то я ждать, пока мой поток, чтобы закончить, но ждать() вызов на резьбе never returns true
, и мой program is stuck in
, в то время как (! M_deviceThread.wait())
Пожалуйста, предложите, как это решить?
Мой devicethread & объект работника определяется в классе MainWindow: -
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
которая работает на кнопке st искусство нажимается: ---
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
}
}
Выглядит хорошо. В чем дело? –
Небезопасно использовать 'm_bquit' из обоих потоков одновременно. Вы должны охранять его с помощью мьютекса. –
Я бы выпустил сигнал в поток, чтобы остановить и сделать m_bquit частным. – drescherjm