簡體   English   中英

Qt向移動到線程的對象發出信號

[英]Qt emit signal to object moved to thread

為了通過設置標志(然后從線程內返回)來啟動停止線程,我需要與它進行通信。

線程是這樣實現的

MyClass* obj = new MyClass(0);
connect( this,SIGNAL( stop() ),obj, SLOT(stop()));
emit stop();    // slot is called (qDebug output)

MyThread = new QThread;
obj->moveToThread(MyThread);
connect( ... started() ... quit() ... finished() ... deleteLater() ...
....

emit stop();    // slot isn't called (qDebug output)

該插槽還沒有任何邏輯,它僅使用qDebug()輸出。 對象的創建和連接在主窗口方法中進行。

不幸的是,我無法弄清楚自己在做什么:將對象移至線程后,插槽將不再運行。

也許您只是忘了復制/粘貼它,但是您錯過了MyThread->start()調用。 同樣,聲明線程的行應該是QThread * MyThread = new QThread(); ,但這可能只是一個錯字。

現在,在回答中,您說使用Qt::DirectConnection似乎已經解決了您的問題。 但是,使用直接連接調用的插槽僅直接調用slot方法。 slot方法正在運行,但從調用線程(發出stop()信號的位置)運行。 即使您的線程未啟動,這也將起作用。 您真正想要的是通過Qt::QueuedConnection調用插槽。 這將在工作線程的事件循環中放置一個事件,然后將調用該插槽。 請注意,如果您未指定,Qt將處理連接類型。

如果排隊的連接不起作用,則可能是您的工作阻塞了線程的事件循環。 在您的工作方法中,您是否曾經將控制權傳遞回事件循環以允許其處理事件? 還是只是在while循環中運行以等待標志更改狀態?

另外,您的代碼不會按原樣編譯/運行。 我假設您已經在處理QApplication東西-即,在您的main功能中設置完所有內容后,調用QApplication::exec() 如果不調用exec() ,則永遠不會啟動主事件循環。

調試輸出實際上是在線程完成工作之后才發生的。 使用

connect( this, SIGNAL(stop()), obj, SLOT(stop()), Qt::DirectConnection);

解決了問題。

暫無
暫無

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

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