[英]Qt Stop worker thread loop from GUI Thread
我有一個工作線程,我試圖通過一個按鈕停止。 我有時會收到以下錯誤:
Fatal: QThread: Destroyed while thread is still running
這是我的代碼。 通過按下斷開連接按鈕,將發出信號以停止線程的while循環。
if (ui->connectButton->text() == "Connect") {
mUDPThread = new QThread;
mUDPWorker = new UDPThread(ui->HostTextEdit->toPlainText(), ui->portTextEdit->toPlainText().toInt());
mUDPWorker->moveToThread(mUDPThread);
connect(mUDPThread, SIGNAL(started()), mUDPWorker, SLOT(process()));
connect(mUDPWorker, SIGNAL(finished()), mUDPThread, SLOT(quit()));
connect(mUDPWorker, SIGNAL(finished()), mUDPWorker, SLOT(deleteLater()));
connect(mUDPWorker, SIGNAL(finished()), mUDPThread, SLOT(deleteLater()));
connect(this, SIGNAL(onExitThread()), mUDPWorker, SLOT(onExitThread()));
connect(this, SIGNAL(onDataIncome(QString)), mUDPWorker, SLOT(onDataIncome(QString)));
mUDPThread->start();
ui->connectButton->setText("Disconnect");
} else if (ui->connectButton->text() == "Disconnect") {
emit onExitThread();
ui->connectButton->setText("Connect");
}
工作線程:
void UDPThread::process() {
while (isRunning) {
QCoreApplication::processEvents();
...
}
emit finished();
}
void UDPThread::onExitThread() {
qDebug() << "onExitThread" << isRunning;
isRunning = false;
}
while (isRunning)
您正在此處阻塞線程,其事件循環無法旋轉以接收信號,它只能將信號發送給具有旋轉事件循環的其他線程。
您需要使工作人員無阻塞,將工作分成多個周期,在事件循環之間旋轉並接收信號。 用偽代碼:
if (isRunning) {
doWorkCycle();
scheduleNextWorkCycle();
} else emit finished();
您可以在此處查看一個示例。
解決了。 錯誤在連接命令內:
connect(mUDPWorker, SIGNAL(finished()), mUDPThread, SLOT(deleteLater()));
至
connect(mUDPThread, SIGNAL(finished()), mUDPThread, SLOT(deleteLater()));
結果:
connect(mUDPThread, SIGNAL(started()), mUDPWorker, SLOT(process()));
connect(mUDPWorker, SIGNAL(finished()), mUDPThread, SLOT(quit()));
connect(mUDPWorker, SIGNAL(finished()), mUDPWorker, SLOT(deleteLater()));
connect(mUDPThread, SIGNAL(finished()), mUDPThread, SLOT(deleteLater()));
connect(this, SIGNAL(onExitThread()), mUDPWorker, SLOT(onExitThread()));
connect(this, SIGNAL(onDataIncome(QString)), mUDPWorker, SLOT(onDataIncome(QString)));
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.