上篇提到一點皮毛, 又寫了一陣子 Gtk+ 後, 筆記一下其它入門心得。
Gtk+ multi-thread
見 GDK Reference Manual - Threads、Is GTK+ thread safe? How do I write multi-threaded GTK+ applications? 和 Multi-threaded GTK applications – Part 1: Misconceptions - Operations and other mysteries。
心得如下:
- 要在 gtk_init() 以前呼叫 g_thread_init(NULL) 和 gdk_threads_init()。
- 總之就是在 main thread 裡做事, 若真的萬不得已想在 main thread 以外做事, 記得先呼叫 gdk_threads_enter(), 結束時再呼叫 gdk_threads_enter(), 這會取得和釋放 GDK 的 global lock。
- callback 不需呼叫 gdk_threads_..., 因為在進 callback 前後會呼叫。
- 注意 GDK 的 global lock 沒有加上 PTHREAD_MUTEX_RECURSIVE, 所以在 callback 裡呼叫 gdk_threads_enter() 會 deadlock。有 PTHREAD_MUTEX_RECURSIVE 會方便許多, 不確定 Gtk+ 這樣實作的考量為何。
另外我觀察 Gtk+ 的執行狀態, 平時就是兩個 thread, 一個是 main thread, 另一個大概是負責收 UI event, 而有任何 UI event, callback 會在 main thread 裡執行。雖說是廢話, 不過自己觀察過後感受更踏實。
上述提的 multi-thread, 是指有再另開 thread, 也有用到 UI 裡的東西時, 才需注意的事項。
Tutorial
The GTK+ programming tutorial 超級實用, 每篇文章精簡易讀, 附有簡短完整範例, 並且有 screenshot 可參考, 快速掃過一遍就能找到很多好東西。剩下不清楚的部份, 可用在 devhelp 查詢關鍵函式, 或 google 關鍵函式, 再連到 GTK+ 2 Reference Manual, 可以搞定多數情況。
devhelp 可透過 aptitude install devhelp 安裝。
> _我觀察 Gtk+ 的執行狀態, 平時就是兩個 thread_
回覆刪除這個好玩了,試試看:
export GTK_IM_MODULE=xim
gdb gtk-demo
(gdb) break pthread_create
(gdb) run
看看 pthread_create() 可有被呼叫?
No mater what you use, epoll, poll, or select for your event loop, they can not handle events that don't passed through file descriptions. I find some projects handle events that is not handled by fd in another thread, and pass messages to main thread with additional pipes or sockets.
回覆刪除照你這樣講, 可能用 non-blocking 的方式只用一個 thread 處理。先忙完手邊的事再來看看, 謝啦
回覆刪除