[英]Signal/slot multithreading Qt
我知道這是關於線程之間的連接信號/插槽機制的下一個問題。 我寫了工作中的工作程序。
主要問題
我的工作人員班級已移至另一個線程。 應用程序的第二部分是帶有按鈕的GUI界面。 當我單擊按鈕時,線程開始:
void MainWindow::startStopThreadA()
{
...
else
{
threadA = new QThread;
workerA = new WorkerObject;
workerA->setMessage("Thread A running");
workerA->moveToThread(threadA);
connect(threadA, SIGNAL(started()), workerA, SLOT(process()), Qt::QueuedConnection);
connect(workerA, SIGNAL(finished()), threadA, SLOT(quit()));
connect(workerA, SIGNAL(finished()), workerA, SLOT(deleteLater()));
connect(threadA, SIGNAL(finished()), threadA, SLOT(deleteLater()));
//Connect signal from thread with slot from MainWindow
connect(workerA, SIGNAL(printMessage(QString)), this, SLOT(printMessage(QString)), Qt::QueuedConnection);
threadA->start();
ui->threadAButton->setText("Stop A");
}
}
當線程啟動時發出信號:
void WorkerObject::process(void)
{
//Infinity thread loop
forever
{
//Exit loop part
mutex.lock();
if(m_stop)
{
m_stop = false;
mutex.unlock();
break;
}
mutex.unlock();
//Hold/unhold loop part
mutex.lock();
if(!m_hold)
{
mutex.unlock();
//Here signal is emited
emit printMessage(messageStr); //That not works
//qDebug() << "Thread A test message."; //That works properly
}
mutex.unlock();
}
emit finished();
}
在主GUI線程中,我有計時器來顯示GUI線程的工作原理。 所以qDebug()
可以正常工作並從我的線程中打印消息。 GUI線程中的計時器也可以正常工作,並在textEdit
GUI字段內打印消息。
現在,當printMessage
信號時,GUI線程執行slot方法:
void MainWindow::printMessage(QString str)
{
ui->textEdit->append(str);
}
這是我的問題中最重要的部分:
當來自workerA
對象的信號printMessage
與帶有Qt::QueuedConnection
GUI插槽printMessage
連接時, 我的應用程序掛斷了 。 無法單擊某些按鈕,甚至無法退出應用程序。
當信號/插槽與Qt::BlockingQueuedConnection
連接時,一切正常。 在線程之間發出和接收消息,並且GUI計時器也可以正常工作。
所以我的問題是為什么連接Qt::QueuedConnection
導致應用程序凍結?
我通過@ m7913d幫助找出了這個問題。
您可以嘗試在您的永遠循環(fe 1秒)內執行QThread :: sleep,以檢查它是否解決了您的問題。
因此,工作線程過於頻繁地發出信號。 在發出信號后添加QThread::msleep(5)
確實有幫助。 也需要包含在內。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.