2012-07-12 37 views
0

我用udp編寫了一個C/S應用程序,它不斷給我提供錯誤,我相信這與我使用線程的方式有關。gtk/c在一個線程中操縱GUI:奇怪的錯誤

當客戶端程序啓動時,它首先初始化一個登錄窗口並啓動一個新線程來偵聽來自服務器的響應。提交用戶名和密碼後,新線程將收到一條消息,指示是否提交了正確的信息。如果是這樣,那麼線程將初始化主GUI窗口。但它會給奇怪的錯誤:

Fatal IO error 11 (Resource temporarily unavailable) on X server :0.0 

python: Fatal IO error 0 (Success) on X server :0.0 

我發現了一個類似的問題here,但它沒有解決。

有人說GUI只能在主線程中操作,但其他人卻說這不是真的。

我也嘗試過使用gdk_threads_enter()gdk_threads_enter()gtk_main()和代碼,我初始化窗口在那個監聽線程。但它似乎沒有工作。

我對線程不太瞭解,因此請耐心指出我做錯了什麼地方。

謝謝。

回答

1

這些錯誤消息,我發現,時不時彈出,當你沒有正確持有GTK鎖。

你應該把gdk_threads_enter()gdk_threads_leave()周圍原來gtk_main()號召,周圍的每一個呼叫到GTK功能,發生

  • 從中你叫gtk_main()
  • 但不是線程之外信號,空閒或超時處理程序。

雖然據我所知,這種用法仍在出路,而在未來的GTK版本中,只能從主線程操縱GTK。

+0

昨天我想到了這一點,但我有另一個問題:無法弄清楚如何在textview中更改爲字體樣式。我找到fontchooser等,但不知道如何申請... – Gnijuohz 2012-07-16 16:24:22

0

確實,GTK窗口應該只能從主線程操縱。

這就是說,在某些體系結構(特別是GNU/Linux的),你可以操縱 GTK窗口從另一個線程只要你正確地gdk_threads_enter()/gdk_threads_leave()使用全局鎖。關鍵詞是「恰當地」,這並不像看起來那麼容易。

這表示,在某些體系結構(特別是MS-Windows上)這樣做可能好像在某個簡單的程序工作,但在更復雜的慘敗。

關於你的問題,你不要說,但你似乎在某處使用Python,但你不會說在哪裏...混合Python和本地線程可能不是一個好主意。