[#39989] TCPSocket.new でスレッドが止まる。 — take_tk <ggb03124@...>

たけ(tk)です。

15 messages 2004/09/02

[#40018] yaml.rbとdate.rbを組み合わせて使った際の問題 — "Keisuke Minami" <keisuke@...>

こんにちは。三並と申します。

14 messages 2004/09/07
[#40020] Re: yaml.rbとdate.rbを組み合わせて使った際の問題 — IWATSUKI Hiroyuki <don@...> 2004/09/07

岩月と申します。

[ruby-list:40055] MultiTkIp class

From: Hidetoshi NAGAI <nagai@...>
Date: 2004-09-17 08:17:00 UTC
List: ruby-list #40055
永井@知能.九工大です.

ruby-dev でもちょっと触れたのですが,multi-tk.rb / remote-tk.rb の
改善を進めておりました.
最新の修正で添付のようなスクリプトでもなんとか動くようになりました
(と思う (^_^;) ので,よかったら試してみてください.

----------------------------------------------------
require 'multi-tk.rb'

th = Thread.new{Tk.mainloop}

TkLabel.new(:text=>'this is a primary master').pack

ip1 = MultiTkIp.new_slave(:safe=>1)
ip2 = MultiTkIp.new_slave(:safe=>2)

cmd = proc{
  require 'tk'

  TkButton.new(:text=>'b1: p self', :command=>proc{p self}).pack(:fill=>:x)
  sleep 0.5
  TkButton.new(:text=>'b2: p $SAFE', :command=>proc{p $SAFE}).pack(:fill=>:x)
  sleep 0.5
  TkButton.new(:text=>'b3: p MultiTkIp.ip_name', 
	       :command=>proc{p MultiTkIp.ip_name}).pack(:fill=>:x)
  sleep 0.5
  TkButton.new(:text=>'EXIT', :command=>proc{exit}).pack(:fill=>:x)

  Tk.mainloop
}

Thread.new{ip1.eval_proc(cmd)}
Thread.new{ip2.eval_proc(cmd)}
cmd.call

th.join
----------------------------------------------------

見てもらうとわかりますが,cmd に代入しているプロシージャは
一般的な Ruby/Tk スクリプトの形をしています.
ですから,もちろん実行するインタープリタについてのパラメータは
明示的には存在していません.

これを master, ip1, ip2 の三つの Tk インタープリタで
*同時に* 実行させています.

にもかかわらず,各ボタンは各インタープリタの root ウィンドウに
適切に生成され,コールバックも各インタープリタの safe-level 
(master は $SAFE==0, ip1 は $SAFE==1, ip2 は $SAFE==2) で
実行されます.
また,master の exit 関数が Ruby 自体を終了させているのに対し,
ip1, ip2 ではそれぞれのインタープリタだけを終了します.

これは,ちょっとしたトリックを使って実現しているわけですが,
一般的なスクリプトをそのままにスレーブインタープリタの上で
実行でき,しかもマスターインタープリタからその状態を参照したり
変更したりできるというのがミソです.
Tcl/Tk の ::safe:: ベースのインタープリタを生成して $SAFE==4 の
環境で実行したりもできますし,Ruby/Tk スクリプトのテスト環境を
作ったりするのにも役立つのではないかと思ってます.

触ってみようと思われた方は,CVS から最新の source を入手して
試してみてください.

# 1.8.x でも 1.9.x でもどちらでもいいはずです.

ext/tk/sample にもいくつかのサンプルスクリプトがありますので,
ついでにそちらも試してみていただけると幸いです.
-- 
                                         永井 秀利 (九工大 知能情報)
                                             nagai@ai.kyutech.ac.jp

In This Thread

Prev Next