2013-02-22 103 views
2

我有一個用PySide編寫的Qt應用程序(Qt Python綁定)。這個應用程序有一個GUI線程和許多不同的QThreads負責執行一些繁重的任務 - 一些相當長的任務。由於這種長時間的任務有時會受阻(通常是因爲它正在等待服務器響應),因此應用程序有時會凍結。在設定的時間間隔內調用QCoreApplications.processEvents()是否安全?

因此,我想知道是否可以每隔一秒左右手動調用QCoreApplication.processEvents()以便GUI事件隊列被清除(處理)?這是一個好主意嗎?

+1

爲什麼主線程凍結,如果所有工作都是由其他線程完成的? – wRAR 2013-02-22 00:40:22

+0

這是一個很好的問題,我沒有很好的答案。我曾經問過Qt論壇,他們說這是因爲應用程序沒有處理任何事件,這就是爲什麼它看起來被凍結。可能還有一些事實,即有100多個線程同時運行。 – 2013-02-22 00:45:56

+0

如果主線程在Qt事件循環中,它應該處理消息(除非您的機器太忙,但與您的代碼沒有直接關係)。 – wRAR 2013-02-22 00:51:22

回答

1

隨時調用QCoreApplication.processEvents()是安全的。 The docs明確說明你的使用情況:

你偶爾可以調用此功能時,你的程序是忙 執行長操作(如複製文件)。

儘管爲什麼線程會阻塞主線程中的事件循環,沒有什麼好的理由。 (除非你的系統真的跟不上。)所以這是值得研究的。

0

一對夫婦提示人們會覺得非常有用:

答:您需要提防如下:

  1. 幾乎每隔一段時間線程想送東西回主線程。所以他們發佈一個事件並且調用processEvents

  2. 如果代碼從事件運行也調用processEvents,那麼不是返回到下一個語句,python可以重新派發一個工作線程,然後可以重複這個過程。

這樣的最終結果可能是成百上千的嵌套processEvent語句,這些語句可能會導致超出遞歸級別的錯誤消息。

道德 - 如果您運行的是多線程應用程序,請不要在由主線程中運行的線程啓動的任何代碼中調用processEvents。

B.您需要知道,CPython有一個全局解釋器鎖(GIL),它可以限制線程,以便只有一個線程可以在任何時候運行,而Python決定運行哪個線程的方式是違反直覺的。從工作線程運行進程事件似乎沒有做到它在罐上所說的事情,並且CPU時間未分配給主線程或Python內部線程。我仍在試驗,但似乎將工作線程休眠幾毫秒允許其他線程查看。

相關問題