2016-03-02 339 views
1

我創建了一個QEventLoop對象,並試圖把quit()消息,啓動它,所以我的目的是爲了進入和退出一個循環之前前:後退出()來QEventLoop EXEC()

QEventLoop loop; 
loop.connect(this, SIGNAL(sig()), SLOT(quit())); 
emit sig(); 
loop.exec(); // can't get past this point 

但是線程在循環循環,永不退出...
我該如何達到預期的行爲?

+0

這是什麼目的? – thuga

+0

@thuga我想從不同的線程調用'QNetworkAccessManager'的'post()'和'get()'。但是這些方法需要從擁有的線程中調用。所以我創建了'wrapperClass',它包含'QNetworkAccessManager'。當用戶調用'wrapper.sendPostRequest(...)'時,我的線程應該等待'QNetworkAccessManager'執行調用,之後我可以繼續。循環似乎是一個合理的方式來暫停線程,並等待'喚醒'信號... :) –

回答

2

這似乎沒有什麼意義,但爲了解答您的問題,您可以連接Qt::QueuedConnection,然後在運行事件循環時接收到quit調用,然後循環將退出正確。

這是可行的,因爲插槽按connect調用順序執行,所以另一個插槽也可以連接到sig(),可以做任何想要的事情,甚至可以啓動自己的事件循環。但是,最後一次連接是您的,並且其排隊呼叫quit將最後發生,排隊呼叫quit和呼叫loop.exec之間沒有其他事件循環操作。

請記住,本地QEventLoops,就像致電QApplication::processEvents,是非常危險的。如果您可以更改代碼,請嘗試設置狀態機以執行異步工作。

+0

感謝您的答案。我會稍後測試你的建議,並在答案的標記。我添加了解釋,爲什麼我在這個問題的評論中選擇了'QEventLoop',你怎麼看? %) –