2014-10-06 70 views
0

我對GDK/GTK相當新,但我試圖讓一些C代碼是線程安全的。 (這是相當大,否則我會在這裏發佈。) 我正在做一些壓力測試,GDB停止了一個錯誤:程序收到信號SIGABRT,中止。該程序在一個名爲gdk_window_get_frame_clock的函數中暫停,該函數根據GDK文檔是用於同步屏幕重新繪製的低級函數。堆棧跟蹤只顯示我「0x0 in ??」爲來電者。 有沒有人知道這裏發生了什麼或我可以開始搜索?我完全困惑。來自gdk_window_get_frame_clock的SIGABRT信號

+0

需要更多信息。查看gdb的堆棧跟蹤,瞭解問題發生時編寫的代碼中發生了什麼,然後從那裏開始。 – 2014-10-06 01:48:08

+0

無法直接從其他線程調用GTK/GDK函數。你是否正確地使用'gdk_threads_enter()'/'gdk_threads_leave()'或其他等價函數來鎖定來自其他線程的所有訪問? – j123b567 2014-10-06 07:36:17

+0

應用程序通過創建一個新的工作線程來設置自身,以在執行和重新繪製期間執行復雜的計算。主線程處理用戶交互。這幾乎肯定是一種競賽條件。 我使用POSIX線程和互斥鎖來控制對我的應用程序變量的訪問。我會嘗試設置關鍵部分,並在有機會時回覆。 – Chris 2014-10-13 14:00:27

回答

0

切勿從包含glib或gtk主循環的線程以外的其他線程中繪製任何內容。使用g_idle_add,g_timeout_add或基於GSource的自定義掛鉤將來自輔助線程的UI更改排入隊列(這些是線程安全的!)

+0

謝謝!這工作。從我所知道的情況來看,GDK 2允許gdk_threads_enter/gdk_threads_leave方法從單獨的線程鎖定GDK資源。但是,GDK 3沒有。現在我使用g_idle_add來調用一個函數來排列主窗口的重繪。這會導致CPU使用率過高,但這是一個很好的起點。 – Chris 2014-11-23 00:02:07

+0

需要更多的細節和代碼給進一步的建議。 – drahnr 2014-11-24 21:14:23