From: nagai@... Date: 2002-05-18T18:02:39+09:00 Subject: [ruby-dev:17136] Re: Thread: deadlock trouble 永井@知能.九工大です. From: Takaaki Tateishi Subject: [ruby-dev:17130] Re: Thread: deadlock trouble Date: Fri, 17 May 2002 23:55:12 +0900 Message-ID: <200205171455.g4HEt33i009934@smtp16.dti.ne.jp> ttate> 単純な方法ですが,以下に類似した方法で解決できるでしょうか? ありがとうございます. ですが,状況はもうちょっとやっかいなんです. 前のメールでも書きましたが,特に困っているのは > ・リソースデータベースのサポートで,Thread を使って > 外部定義手続きを特定のセーフレベルで実行したいけれど, > そうした手続きから他の widget をいじろうとすると deadlock で落ちる. という辺りです. ですので,生成した Thread の戻値が欲しいのですが, いただいた案ですと,以下の部分で ttate> TkButton.new(nil, 'text'=>'Thread{b1.invoke}', ttate> 'command'=>proc{TkThread.new{b1.invoke}}).pack ttate> TkButton.new(nil, 'text'=>'Thread{b2.invoke}', ttate> 'command'=>proc{TkThread.new{b2.invoke}}).pack TkThread.new{...} の部分を TkThread.new{...}.value とすると みごとに固まってしまいます. # まだ十分な検討はしていませんので,もしかすると, # ちょっと手を入れるだけでいいのかもしれません. # そうであればごめんなさい. また, > ・Tcl_DoOneEvent を使った Tk.mainloop の代換品を検討していて > Thread{loop{TclTkLib.do_one_event(EventFlag::ALL | EventFlag::DONT_WAIT)}} > などとしてテストしてみたら,deadlock で落ちた. についても考えると,速度面にクリティカルに響いてくる部分ですので, できることなら C レベルでの解決策も欲しいところです. まぁ,後者については緊急性は低いので, とりあえずは前者だけでもどうにかできればいいのですが... -- 永井 秀利 (九工大 知能情報) nagai@ai.kyutech.ac.jp