むとうともうします。

あるボタンを押すと時間のかかるループ処理を行いたいと思ったのですが、
ただ、そのまま処理を書いてしまうと、処理を行っている間、画面が
再描画されずに「固まった」ように見えてしまいます。

先日Styleについて質問させて頂いたとき、yashiさんからgtk mlを存在を
教えて頂いたので、そちらの過去アーカイブを探したところ、

while(gtk_events_pending()) {
    gtk_main_iteration();
}

を使う方法が紹介されていましたのでRuby/GTKでも同じだろうと思って以下のような
テストプログラムを作ってみましたがうまくいきませんでした。

具体的には、常にpending = 1 となり、whileを抜けてくれないようなんです。

これって使い方間違ってますでしょうか?


ちなみに、ruby-listの過去アーカイブにGtk::idle_add()を使う方法を
見つけました。そちらはきちんと動くのですが、なんとなくこっちの方が
スマートな感じがしたので....。

--
require 'gtk'

button1 = Gtk::Button.new("click!")
button2 = Gtk::Button.new("click!")
button1.signal_connect(Gtk::Button::SIGNAL_CLICKED) do
    #以下のループは「重い」ループです。    
    for cnt in 1 .. 10
       while(Gtk.events_pending > 0) do
            printf("pending = %d\n", Gtk.events_pending)
            Gtk.main_iteration
       end
       sleep(1)
       printf("loop cnt = %d\n", cnt)
    end
end

vbox = Gtk::VBox.new(false,5)
vbox.pack_start(button1)
vbox.pack_start(button2)

window = Gtk::Window.new(Gtk::WINDOW_TOPLEVEL)
window.set_usize(100,100)
window.add(vbox)
window.show_all
Gtk.main

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