簡體   English   中英

Qt使用具有不同線程的信號和插槽

[英]Qt-Using signals and slots with different threads

我仍在努力使它按預期工作。

我有一個Qt項目,我想根據來自不同線程的信號狀態進行更新。 我的主GUI線程應該啟動一個按啟動按鈕運行的工作線程。

然后,工作線程應該執行一個函數,該函數連續輪詢屬於另一個類的變量,這些變量甚至是由另一個線程更新的(我正在使用portaudio庫)。 然后,它將觸發一個信號(sendNewSig),該信號連接到我的GUI類中的插槽(DrawData)。

問題是當我按下開始按鈕時程序崩潰。 我相信我缺少一些開始執行工作線程的重要步驟。 通過單擊“開始”按鈕時像這樣調用updater-> PollSignal(),我希望它在新線程中運行,但也許不會。 我已經在下面的代碼部分中顯示了希望足以使我的想法明白的部分。

非常感謝您的任何幫助

在GUIApp.cpp中

AudioGuiApplication::AudioGuiApplication(QWidget *parent)
: QMainWindow(parent)
{
    ui.setupUi(this);

    //......  other stuff

    thread = new QThread(this);
    updater = new GUIUpdater(&audio_processor);
    updater->moveToThread(thread);

    connect(updater, SIGNAL(sendNewSig(string)), this, SLOT(DrawData(string)));

    connect(thread, SIGNAL(destroyed()), updater, SLOT(deleteLater()));

    actionText->setPlainText("Press Start to begin ");
}

void AudioGuiApplication::on_startButton_clicked()
{
    updater->PollSignal();
}

在GUIUpdater.cpp中

void GUIUpdater::PollSignal() 
{ 
    string str;

    while (!ap->IsNewDataFound() )
    {
        emit sendNewSig(str);
        ap->SetNewSigFound(false);
    }
}`

您正在直接從main / gui線程調用PollSignal函數。

我認為在所需線程中執行它的最簡單方法是采用Signal&Slot機制,將QTimer設置為無延遲( 0代表0毫秒):

void AudioGuiApplication::on_startButton_clicked()
{
    QTimer::singleShot(0, updater, &GUIUpdater::PollSignal);
}

順便說一句:您應該考慮改用不依賴宏的“新” connect語法 ,而可以使用編譯時類型驗證。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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