2012年4月6日 星期五

Gtk+ 入門 (2)

上篇提到一點皮毛, 又寫了一陣子 Gtk+ 後, 筆記一下其它入門心得。

Gtk+ multi-thread

GDK Reference Manual - ThreadsIs 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 安裝。

3 則留言:

  1. > _我觀察 Gtk+ 的執行狀態, 平時就是兩個 thread_

    這個好玩了,試試看:
    export GTK_IM_MODULE=xim
    gdb gtk-demo
    (gdb) break pthread_create
    (gdb) run
    看看 pthread_create() 可有被呼叫?

    回覆刪除
  2. 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.

    回覆刪除
  3. 照你這樣講, 可能用 non-blocking 的方式只用一個 thread 處理。先忙完手邊的事再來看看, 謝啦

    回覆刪除

在 Fedora 下裝 id-utils

Fedora 似乎因為執行檔撞名,而沒有提供 id-utils 的套件 ,但這是使用 gj 的必要套件,只好自己編。從官網抓好 tarball ,解開來編譯 (./configure && make)就是了。 但編譯後會遇到錯誤: ./stdio.h:10...