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