|
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...>
|