[#36686] 1.1 < 61.1 - 60.0 — Shin-ichiro HARA <sinara@...>

原です。

19 messages 2002/12/06

[#36770] www.ruby-lang.orgリニューアル準備のお知らせ — TADA Tadashi <sho@...>

ruby-lang.orgのwebmasterチームでは、タイムリーな情報提供と使いやすい

11 messages 2002/12/16

[ruby-list:36652] Re: Gtk.main

From: Masao Mutoh <mutoh@...>
Date: 2002-12-03 11:27:16 UTC
List: ruby-list #36652
むとうです。

On Tue, 3 Dec 2002 17:22:32 +0900
TOYOFUKU Chikanobu <toyofuku@juice.or.jp> wrote:

>    豊福です。
> 
> なかださん
>  > Gtk.mainを同時に二つは無理なのでは。こんなメッセージが怒涛のよ
>  > うに出てきます。
>  > GLib-WARNING **: g_main_iterate(): main loop already active in another thread
> 
>    一応 kill しているつもりなのですがやり方まずいですかね。

なかださんがすでにご指摘になっていますが、メインループ(Gtk.main)を
別のスレッドで複数起こすというのはとってもマズイ気が...。

> やりたいことは重い処理をしている間ダイアログを出して待たせて
> (「重い処理中断」ボタンもつける)、ウィンドウが expose され
> たときのために再描画もさせたいということなのですがどのように
> 書くのがよいでしょうか。

以下のサンプルは参考になりますでしょうか。

--------------------
require 'gtk'
#require 'gtk2'
#Gtk.init

start_button = Gtk::Button.new("start")
start_button.signal_connect("clicked") do
  unless @th
    @th = Thread.new { #ここに思い処理を書きます。
      (0...10).each { |cnt|
        sleep(1)
        puts "cnt = #{cnt}\n"
        cnt += 1
      }
      puts "finished"
      @th = nil
    }
  end
end
stop_button = Gtk::Button.new("stop")
stop_button.signal_connect("clicked") do
  if @th
    @th.kill
    puts "killed"
    @th = nil
  end
end

box = Gtk::VBox.new.add(start_button).add(stop_button)
Gtk::Window.new.add(box).show_all

Gtk.main
--------------------
ダイアログを表示してから待たせておくにはGtk.main, Gtk.main_quitを
ネストして使います。
こちらは、手前味噌ですが、
http://www.sowhat.com/homepage/tips/gtk_dialog.html#sec:2
を参考にしてみてください。



蛇足ですが、
最初の2つのコメントを外して1行目をコメントアウト
するとRuby/GTK2で動作します。

それでは。
-- 
.:% Masao Mutoh<mutoh@highway.ne.jp>

In This Thread