2012-02-01 81 views
0

我有一個從threading.Thread繼承的類。 從隊列中處理一個項目之後,我希望它在啓動時調用一個我交給線程的函數。從run-Method執行回調將使其在我的工作線程中運行。有沒有辦法在MainThread中運行該回調?從主線程中的子類線程執行回調

感謝&問候, 肖恩

回答

0

推的方法到一個隊列,並有主線程好整以暇該隊列,運行的每個方法,因爲它拉他們。

0

您可以使用條件變量並讓主線程等待來自子線程的消息。子線程可以通知主線程調用該方法。

+0

感謝您的回覆。 問題是,我將不得不保持執行我的MainThread(保存Qt4 GUI),直到工作線程完成並且會導致GUI無響應(工作線程正在執行數據庫相關的工作,時間) – forellenfuerst 2012-02-01 16:37:36

+0

請參閱我對pyqt特定解決方案的回答。我認爲你alao可能需要閱讀更多關於使用pyqt的信息 – jdi 2012-02-01 16:51:26

3

你沒有提到你正在使用pyqt。 Qt有專門爲此設計的信號和插槽。如果你使用QThread啓動你的線程,那麼它有'完成'信號,你的主線程可以連接到一個插槽上。如果你需要對結果信號進行更多的控制,你可以用任何你想要的值從線程中發出一個自定義的信號。當您構建線程時,只需將其信號連接到您想作爲回調的插槽。 否則,如果您正在專門等待線程,則會阻止您的主事件循環。

這裏是關於新型信號/插槽具體的鏈接:http://www.riverbankcomputing.co.uk/static/Docs/PyQt4/html/new_style_signals_slots.html

這使得它現在非常容易創建任何你想要的簽名蟒蛇信號,並以面向對象的方式連接到插槽。

另外,作爲關於PyQt的一個備註......這裏的一些其他答案建議在您的主線程上創建一個循環,等待從其調度的線程收集隊列中的響應。這基本上就是PyQt所做的。當您啓動應用程序時,主線程進入事件循環。此事件循環正在處理堆疊在其事件隊列中的事件。有不同類型的信號/插槽連接。如果你的兩個端點在同一個線程中,那麼將建立直接連接並且發射信號將調用該插槽。如果它們在不同的線程中,那麼我相信它會經歷事件循環,以便它可以在發射器線程之外進行處理。