我創建了一個QEventLoop
對象,並試圖把quit()
消息,啓動它,所以我的目的是爲了進入和退出一個循環之前前:後退出()來QEventLoop EXEC()
QEventLoop loop;
loop.connect(this, SIGNAL(sig()), SLOT(quit()));
emit sig();
loop.exec(); // can't get past this point
但是線程在循環循環,永不退出...
我該如何達到預期的行爲?
我創建了一個QEventLoop
對象,並試圖把quit()
消息,啓動它,所以我的目的是爲了進入和退出一個循環之前前:後退出()來QEventLoop EXEC()
QEventLoop loop;
loop.connect(this, SIGNAL(sig()), SLOT(quit()));
emit sig();
loop.exec(); // can't get past this point
但是線程在循環循環,永不退出...
我該如何達到預期的行爲?
這似乎沒有什麼意義,但爲了解答您的問題,您可以連接Qt::QueuedConnection
,然後在運行事件循環時接收到quit
調用,然後循環將退出正確。
這是可行的,因爲插槽按connect
調用順序執行,所以另一個插槽也可以連接到sig()
,可以做任何想要的事情,甚至可以啓動自己的事件循環。但是,最後一次連接是您的,並且其排隊呼叫quit
將最後發生,排隊呼叫quit
和呼叫loop.exec
之間沒有其他事件循環操作。
請記住,本地QEventLoops
,就像致電QApplication::processEvents
,是非常危險的。如果您可以更改代碼,請嘗試設置狀態機以執行異步工作。
感謝您的答案。我會稍後測試你的建議,並在答案的標記。我添加了解釋,爲什麼我在這個問題的評論中選擇了'QEventLoop',你怎麼看? %) –
這是什麼目的? – thuga
@thuga我想從不同的線程調用'QNetworkAccessManager'的'post()'和'get()'。但是這些方法需要從擁有的線程中調用。所以我創建了'wrapperClass',它包含'QNetworkAccessManager'。當用戶調用'wrapper.sendPostRequest(...)'時,我的線程應該等待'QNetworkAccessManager'執行調用,之後我可以繼續。循環似乎是一個合理的方式來暫停線程,並等待'喚醒'信號... :) –