むとうです。

On Sun, 20 Aug 2000 19:56:28 +0900
MUTOH Masao <mutoh / highway.ne.jp> wrote:
>Re: [ruby-ext:01201] Ruby/GTK での重いメソッド中での再描画について
> while(gtk_events_pending()) {
>     gtk_main_iteration();
> }
> 
> を使う方法が紹介されていましたのでRuby/GTKでも同じだろうと思って以下のような
> テストプログラムを作ってみましたがうまくいきませんでした。
(略)
> 具体的には、常にpending = 1 となり、whileを抜けてくれないようなんです。


この件を調べてるのですが、とりあえず途中報告です。

まず、原因ですが、rbgtk.c の最後の方の

#if 1
    gtk_idle_add((GtkFunction)idle, 0);
#else
    /* use timeout to avoid busy wait */
    gtk_timeout_add(100, (GtkFunction)idle, 0);
#endif

のところのようです。

具体的には、gtk_idle_add()の前後でgtk_events_pending()を出力すると後の方で1を
返します。idleという関数がイベントとして追加されてしまったしまったという
ことでしょうか。

ちなみに、この部分を全てコメントにするとGtk.events_pending自体は正常に
動きます(多分)。

ただ、そうするとCtrl+cとかでRuby/GTKのウインドウを殺せなくなります。
多分、それが理由で上記コードをいれているのかと思いますが...。

gtk_timeout_add()の方だと大体うまくいくのですが、動作がすごく重くなって
しまう感じがします。

というわけで、ここをどうにかすればうまくいくと思うのですが、
どうすれば良いかはこれから勉強します(あぁ、道は遠い....(^^;))。
もし、どなたかすでに解決策をご存知でしたら教えていただけると助かります。

それでは。
----
○● むとう まさお(MUTOH Masao)    
●○ E-Mail:mutoh / highway.ne.jp