From: Masao M. <mu...@hi...> - 2003-03-08 17:57:04
|
むとうです。 enの方で要望が出ていたのでマルチスレッドに対応してみました。 gtk2ライブラリが初期化(init.c)されるときに g_thread_init (NULL); gdk_threads_init(); を呼び出しています。 #これはRubyから呼び出す関数にしようと思ったのですが、 #タイミング的にここでやらないとうまく動作しませんでした。 あとは、*GTK+全体に対し*ロックをかけたいところで Gdk::Threads.enter, Gdk::Threads.leaveを呼び出します。 #Mutexにならい、Gdk::Threads.synchronize{ }も用意しました。 でも、このGdk::Threads.enter,leaveを、普通にロックするつもりで 使うとロックかけたまま戻ってこなくなります。 以下のURLの例みたいな感じで試しましたが、子スレッド側の Gdk::Threads.enter,leaveがうまく行きませんでした。 http://developer.gnome.org/doc/API/2.0/gdk/gdk-Threads.html 唯一、Gtk.mainの周囲を Gdk::Threads.synchronize{ Gtk.main } とすることはできましたが...。 もしかしたら、pthreadを使うとうまくいくのかもしれませんが、 そこまでは追っていません。 ま、でも、初期化部分を追加しただけでもGtk::Label等は 子スレッド側からラベルを更新・表示できるようになったので (今まではできなかった)、この修正自体はこれで良いのかなぁ と思ってます。 一応、Gdk::Threads.enter/leaveを使わない例(^^;)ですが、 スレッドを使ったサンプルをCVSのsample/misc/threads.rbに あげておきました。 何か問題があったら教えてください。 -- .:% Masao Mutoh<mu...@hi...> |