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