[#45240] ruby-1.8.5-p231にアップデートしたら"original_filename"が取れなくなりました — hayashi <36hayashi@...>

林と申します。

9 messages 2008/07/18

[#45267] [ANN] Ruby 1.9.0-3リリース — "Yugui (Yuki Sonoda)" <yugui@...>

Yuguiです。

16 messages 2008/07/25

[ruby-list:45186] Re: ソース:インストール:MacOSX10.3.9

From: Hidetoshi NAGAI <nagai@...>
Date: 2008-07-04 05:15:25 UTC
List: ruby-list #45186
永井@知能.九工大です.

rom: Ryutaro Amano <wn9r-amn@asahi-net.or.jp>
Subject: [ruby-list:45184] Re: ソース:インストール:MacOSX10.3.9
Date: Thu, 3 Jul 2008 20:01:06 +0900
Message-ID: <BBDF25D8-9635-489B-AE43-774900126281@asahi-net.or.jp>
> 天野です。RES遅くなり申し訳ありません。

お世話になってます.

> > README.tcltklib の末尾あたりにある --enable-tcl-thread を
> > configure オプションに追加して,threaded であることを 
> > 明示してやると
> > どうなるでしょうか.
> 
> 確かにpthreadへのwarningはなくなりますが、やはり 
> 同じエラーです。
   (snip)
> パッケージ作者のDaniel A. Steffenさんは、既に10.3.9 
> の走るマシンを持ってないそうです。

早い話,この点については Ruby/Tk 側には責任はないということで
良いのでしょうね.

# pthread 認識の失敗については,tclConfig ファイルの内容と
# 現実のライブラリとに不整合があるのかもしれません.

> 10.3.9の方はtcltkをソースからインストールすると問題ない 
> 訳ですが、10.5のほうの
> 1.9.0-2と組み合わせた際の
> 
> Tk_MacOSXSetupTkNotifier: first [load] of TkAqua has to occur in the  
> main thread!
> Abort trap
> 
> これはソースからインストールしても同じなので、何とかなると嬉 
> しいのですが。

このエラーは tkMacOSXNotify.c の Tk_MacOSXSetupTkNotifier で
出ているのですが,コメントによると eventloop thread は
アプリケーションの main native thread で動かさないと
ならないということのようなので困っています.

ご存じの通り,Ruby 1.9 では thread ごとに native thread が
生成されます.
Tk の eventloop は,Tcl/Tk インタープリタを初期化した 
native thread 上でしかまともにはきませんから,
Ruby 1.9 では新しく thread を生成して
その中でインタープリタの生成および eventloop の稼働を
行うようにしています.
で,Tk.mainloop はこの thread を監視するような形にすることで
Thread.new{Tk.mainloop} としても大丈夫なように対策し,
Ruby 1.8 との互換性を維持しています.

ところが,MacOS X (Carbon) では,eventloop を 
main thread で動かさない限りは動作しないということになると,
この方法が使えないということになるわけです.
かといって main thread を勝手に乗っ取るわけにもいかないので,
「はてさてどうすべきか...」という状況です.

Tk.mainloop を main thread で実行しさえすれば問題は出ず,
かつ,アプリケーションの最後で Tk.mainloop を実行するような
コーディングで構わないということであれば,
「そんなときのために」の機能をすでに組み入れてはいます.
もし試してみていただけるなら,
----------------------------------------------------------
module TkCore; RUN_EVENTLOOP_ON_MAIN_THREAD = true; end
require 'tk'
----------------------------------------------------------
というように,'tk' を require する前に
定数を宣言していただけないでしょうか.
これをやれば,Ruby 1.8 と同様に,
インタープリタ生成に際して thread を作って
eventloop まで起動しておくというのはしなくなります.
その代り,main thread 以外で Tk.mainloop を動かしても
全く機能しないはずです.

試してみていただいた結果,これであれば動くということであれば,
応急処置的に MacOS X (Carbon) では RUN_EVENTLOOP_ON_MAIN_THREAD を
true としてしまうことは可能かと思います.
制約はあるわけですが,全く動かないよりはマシですので.

# 「応急処置的に」とは言ってますが,
# 仕組みに対しての理解が正しければ,
# 解消できるかどうかは甚だ疑問です.

intel Mac と PowerPC Mac とでは違うという話もあるようですし,
正直なところ,テスト環境のない私ではすべてに確信が持てません.
MacOS X 10.5 + Ruby 1.9.0-2 + Tcl/Tk 8.5 というような環境での
テストが可能な方がいらっしゃいましたら,
テスト結果を教えていただけますと助かります.
ただ,残念ながら「報告いただければ解決します」とは言えないのが
現実であり,申し訳なくもあるのですが...
-- 
永井 秀利  (nagai@ai.kyutech.ac.jp)
九州工業大学 大学院情報工学研究院 知能情報工学研究系

In This Thread