2008年7月 4日

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

永井@知能.九工大です.

rom: Ryutaro Amano <wn9r-amn@xxxxx>
Subject: [ruby-list:45184] Re: ソース:インストール:MacOSX10.3.9
Date: Thu, 3 Jul 2008 20:01:06 +0900
Message-ID: <BBDF25D8-9635-489B-AE43-774900126281@xxxxx>
> 天野です。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@xxxxx)
九州工業大学 大学院情報工学研究院 知能情報工学研究系


投稿者 xml-rpc : 2008年7月 4日 14:15
役に立ちました?:
過去のフィードバック 平均:(0) 総合:(0) 投票回数:(0)
本記事へのTrackback: http://hoop.euqset.org/blog/mt-tb2006.cgi/74948
トラックバック
コメント
コメントする




画像の中に見える文字を入力してください。