From: Hidetoshi NAGAI Date: 2010-05-25T17:46:03+09:00 Subject: [ruby-core:30414] Re: tk doesn't startup well in doze From: Roger Pack Subject: [ruby-core:30397] Re: tk doesn't startup well in doze Date: Tue, 25 May 2010 01:21:58 +0900 Message-ID: > > Does it occur with RubyTk-Kit version (it based on latest tcltklib.c)? > It doesn't (nice). Just with 8.5 built from source with msys/mingw. > Haven't tried with 8.4 > > I did notice that with the rubytk-kit and the other they both open up > a "mystery" tk window in the background when I do the > require 'tk' (snip) > > If call the following before "require 'tk'", does anything change? > > ------------------------------------------------ > > module TkCore; RUN_EVENTLOOP_ON_MAIN_THREAD = true; end > > It seems that fixes all the above problems. The mystery window > doesn't appear, I am able to exit without hanging, and no error > message is output. Maybe I see the reason of the problem. Could you do one more try? Please call the following before "require 'tk'". ------------------------------------------------------------- module TkCore; RUN_EVENTLOOP_ON_MAIN_THREAD = false; end ------------------------------------------------------------- ^^^^^ Probably, it has no error message and show a root window after calling "require 'tk'". Ruby1.9 uses one native thread for one ruby thread. But Tk (eventloop) must run on the native thread on which a Tcl/Tk interpreter is initialized. tk.rb on Ruby1.8 creates a Tcl/Tk interpreter when required. But when it is used on Ruby 1.9, Tk.mainloop must be called on the main thread (that is, Thread.new{Tk.mainloop} doesn't work) because the Tcl/Tk interpreter is initialized on the main thread. So, on Ruby1.9, tk.rb creates a thread on which a Tcl/Tk interpreter is initialized and an eventloop is running. And then, Thread.new{Tk.mainloop} will work. But as its side effect, a root window is displayed as soon as tk.rb is required. However, TkAqua on MacOS X may run on a main nativethread only. It means that both of initializing a Tcl/TkAqua interpreter and starting Tk.mainloop must be done on the main thread. TkCore::RUN_EVENTLOOP_ON_MAIN_THREAD can select those running mode at "require 'tk'" (cannot change after that). When true, Tk.mainloop can be run on the main thread only. If the constant is not defined, tk.rb creates and deletes a Tcl/Tk interpreter to check its environment. I think that the deleted interpreter raises the problem. To remove creating the dummy interpreter from tk.rb, extconf.rb on Mac OSX must check Tcl/Tk libraries in detail. Please give me time to fix, because I'm not familiar with development on Mac OSX. -- Hidetoshi NAGAI (nagai@ai.kyutech.ac.jp)