簡體   English   中英

信號/插槽多線程Qt

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM