Ruby 1.9.1 + Tk problem

D

Diego Virasoro

Hello,
I have a Ruby/Tk code that runs perfectly in 1.8.x but stalls in
1.9.1.

Doing some investigation it seems that even the very basic programs:
require 'tk'

(that's not a mistake... it's literally only the require line) ends up
freezing the program. Anyone has any idea on what could be the
problem?

I am running Mac Os X 10.4 (Tiger), on a G4 machine.

Thank you

Diego
 
H

Hidetoshi NAGAI

From: Diego Virasoro <[email protected]>
Subject: Ruby 1.9.1 + Tk problem
Date: Mon, 6 Apr 2009 19:34:21 +0900
Message-ID: said:
I have a Ruby/Tk code that runs perfectly in 1.8.x but stalls in
1.9.1.

Doing some investigation it seems that even the very basic programs:
require 'tk'

(that's not a mistake... it's literally only the require line) ends up
freezing the program. Anyone has any idea on what could be the
problem?

I am running Mac Os X 10.4 (Tiger), on a G4 machine.

I'm very sorry, but I cannot check troubles on Mac OSX.
I need main information (trial and error) to fix troubles.

First of all, does the following work fine?
---------------------------------------------------------------------
require 'tcltklib'
ip = TclTkIp.new
ip._invoke('button', '.b', '-text', 'TEST', '-command', 'puts OK')
ip._invoke('pack', '.b')
TclTkLib.mainloop
 
J

Jun Young Kim

tested on linux (ruby 1.9.1, tk8.5.3, tcl8.5.3)

successful compilation..

but, the script you've suggested

require 'tcltklib'
ip =3D TclTkIp.new
ip._invoke('button', '.b', '-text', 'TEST', '-command', 'puts OK')
ip._invoke('pack', '.b')
TclTkLib.mainloop

generated the following error.

ruby test.rb
test.rb:1:in `require': no such file to load -- tcltklib (LoadError)
from test.rb:1:in `<main>'

is this different problems?

2009. 04. 07, =BF=C0=C0=FC 6:51, Hidetoshi NAGAI =C0=DB=BC=BA:
 
H

Hidetoshi NAGAI

From: Jun Young Kim <[email protected]>
Subject: Re: Ruby 1.9.1 + Tk problem
Date: Tue, 7 Apr 2009 11:12:15 +0900
Message-ID: said:
generated the following error.

ruby test.rb
test.rb:1:in `require': no such file to load -- tcltklib (LoadError)
from test.rb:1:in `<main>'

is this different problems?

Yes.
Probably, ext/tk/extconf.rb failed to find Tcl/Tk headers or libraries.
So, extconf.rb made an invalid Makefile, and tcltklib.c wasn't compiled.
Please read ext/tk/README.tcltklib and re-generate a proper Makefile.
 
D

Diego.Virasoro

I'm very sorry, but I cannot check troubles on Mac OSX.
I need main information (trial and error) to fix troubles.

Thanks for the effort then. :)
First of all, does the following work fine?
Yep. It does.

Tell me what to test next. :)

Diego
 
H

Hidetoshi NAGAI

From: (e-mail address removed)
Subject: Re: Ruby 1.9.1 + Tk problem
Date: Wed, 8 Apr 2009 23:45:08 +0900
Message-ID: said:
Yep. It does.

Tell me what to test next. :)

Well, could you try the following patch?

--- tk.rb.orig 2009-04-07 06:04:22.000000000 +0900
+++ tk.rb 2009-04-09 06:27:07.000000000 +0900
@@ -1130,30 +1130,30 @@
opts = ''
end

- if WITH_RUBY_VM ### check Ruby 1.9 !!!!!!!
- # *** NEED TO FIX ***
- ip = TclTkIp.new(name, opts)
- if ip._invoke_without_enc('tk', 'windowingsystem') == 'aqua' &&
- (TclTkLib.get_version <=> [8,4,TclTkLib::RELEASE_TYPE::FINAL,9]) > 0
- # *** KNOWN BUG ***
- # Main event loop thread of TkAqua (> Tk8.4.9) must be the main
- # application thread. So, ruby1.9 users must call Tk.mainloop on
- # the main application thread.
- RUN_EVENTLOOP_ON_MAIN_THREAD = true
- INTERP = ip
- else
- unless self.const_defined? :RUN_EVENTLOOP_ON_MAIN_THREAD
- RUN_EVENTLOOP_ON_MAIN_THREAD = false
- end
- if RUN_EVENTLOOP_ON_MAIN_THREAD
+ unless self.const_defined? :RUN_EVENTLOOP_ON_MAIN_THREAD
+ if WITH_RUBY_VM ### check Ruby 1.9 !!!!!!!
+ # *** NEED TO FIX ***
+ ip = TclTkIp.new(name, opts)
+ if ip._invoke_without_enc('tk', 'windowingsystem') == 'aqua' &&
+ (TclTkLib.get_version<=>[8,4,TclTkLib::RELEASE_TYPE::FINAL,9]) > 0
+ # *** KNOWN BUG ***
+ # Main event loop thread of TkAqua (> Tk8.4.9) must be the main
+ # application thread. So, ruby1.9 users must call Tk.mainloop on
+ # the main application thread.
+ RUN_EVENTLOOP_ON_MAIN_THREAD = true
INTERP = ip
else
- ip.delete
+ unless self.const_defined? :RUN_EVENTLOOP_ON_MAIN_THREAD
+ RUN_EVENTLOOP_ON_MAIN_THREAD = false
+ end
+ if RUN_EVENTLOOP_ON_MAIN_THREAD
+ INTERP = ip
+ else
+ ip.delete
+ end
end
- end
- ip = nil
- else
- unless self.const_defined? :RUN_EVENTLOOP_ON_MAIN_THREAD
+ ip = nil
+ else
RUN_EVENTLOOP_ON_MAIN_THREAD = false
end
end
@@ -1202,6 +1202,9 @@
INTERP_THREAD_STATUS = INTERP_THREAD[:status]
end

+ # WINDOWING_SYSTEM = TclTkLib::WINDOWING_SYSTEM
+ WINDOWING_SYSTEM = INTERP._invoke_without_enc('tk', 'windowingsystem')
+
def INTERP.__getip
self
end
@@ -1703,12 +1706,15 @@
TclTkLib.mainloop(check_root)

elsif TkCore::RUN_EVENTLOOP_ON_MAIN_THREAD
- # if TclTkLib::WINDOWING_SYSTEM == 'aqua' &&
- if TkCore::INTERP._invoke_without_enc('tk','windowingsystem')=='aqua' &&
- Thread.current != Thread.main &&
- (TclTkLib.get_version <=> [8,4,TclTkLib::RELEASE_TYPE::FINAL,9]) > 0
- raise RuntimeError,
- "eventloop on TkAqua ( > Tk8.4.9 ) works on the main thread only"
+ if Thread.current != Thread.main
+ msg = 'eventloop on '
+ if TkCore::WINDOWING_SYSTEM == 'aqua' &&
+ (TclTkLib.get_version<=>[8,4,TclTkLib::RELEASE_TYPE::FINAL,9]) > 0
+ msg << "TkAqua ( > Tk8.4.9 )"
+ else
+ msg << "your current environment (or setting)"
+ end
+ raise RuntimeError, msg << " works on the main thread only"
end
TclTkLib.mainloop(check_root)
 
D

Diego.Virasoro

I'll try as soon as I can (though I am a bit busy right now).

However I tried to read a bit of the tk.rb file... and noticed the
known bug about TkAqua. My Tk is version 8.4.7... could it be that
that too has the same bug? (you check for a version >8.4.9).

Thanks again.

Diego
 
H

Hidetoshi NAGAI

From: (e-mail address removed)
Subject: Re: Ruby 1.9.1 + Tk problem
Date: Thu, 9 Apr 2009 22:25:04 +0900
Message-ID: said:
However I tried to read a bit of the tk.rb file... and noticed the
known bug about TkAqua. My Tk is version 8.4.7... could it be that
that too has the same bug? (you check for a version >8.4.9).

May not be...
I thought that such kind of trouble depends on TkAqua's specification
with native threads.
If you use standard Tcl/Tk.framework libraries and you have no other
Tcl/Tk libraries on your MacOSX box, please tell me your configure
options when you compiled ruby (tcltklib).

However, I'm happy if you try the patch and report the result of the
following two test codes which are different at the first line only.
---------------------------------------------------------------
module TkCore; RUN_EVENTLOOP_ON_MAIN_THREAD=false; end
p TkCore::RUN_EVENTLOOP_ON_MAIN_THREAD
require 'tk'
p TkCore::RUN_EVENTLOOP_ON_MAIN_THREAD
p TkButton.new:)text=>'TEST',:command=>proc{p 'test'}).pack
Tk.mainloop
---------------------------------------------------------------
---------------------------------------------------------------
module TkCore; RUN_EVENTLOOP_ON_MAIN_THREAD=true; end
p TkCore::RUN_EVENTLOOP_ON_MAIN_THREAD
require 'tk'
p TkCore::RUN_EVENTLOOP_ON_MAIN_THREAD
p TkButton.new:)text=>'TEST',:command=>proc{p 'test'}).pack
Tk.mainloop
 
J

Jun Young Kim

this is a first example.
$> ruby test.rb
false
false
#<Tk::Button:0x000000012257a8 @path=3D".w00000">
"test" <-- when I click "TEST" button.
"test"
"test"

this is a second example.
$> ruby test.rb
true
true
#<Tk::Button:0x00000000be2918 @path=3D".w00000">
"test" <-- when I click "TEST" button.
"test"

2009. 04. 10, =BF=C0=C0=FC 6:22, Hidetoshi NAGAI =C0=DB=BC=BA:
 
H

Hidetoshi NAGAI

From: Jun Young Kim <[email protected]>
Subject: Re: Ruby 1.9.1 + Tk problem
Date: Tue, 14 Apr 2009 16:37:26 +0900
Message-ID: said:
this is a first example. (snip)
this is a second example.

Thank you for your report.

Probably, your test environment is
tested on linux (ruby 1.9.1, tk8.5.3, tcl8.5.3)

(based on [ruby-talk: 333180]).

I think that the trouble doesn't occur on linux.
I reconfirmed that by your report.
Thank you, again.

But now, we investigate the trouble on MacOS X
(or Diego's environment ;-)).
I have no MacOS X environment.
So, I need many information or advices to fix the problem.
 
D

Diego.Virasoro

From: (e-mail address removed)
Subject: Re:Ruby1.9.1+Tkproblem
Date: Thu, 9 Apr 2009 22:25:04 +0900


May not be...
I thought that such kind of trouble depends on TkAqua's specification
with native threads.
If you use standard Tcl/Tk.framework libraries and you have no other
Tcl/Tklibraries on your MacOSX box, please tell me your configure
options when you compiledruby(tcltklib).

However, I'm happy if you try the patch and report the result of the
following two test codes which are different at the first line only.
---------------------------------------------------------------
module TkCore; RUN_EVENTLOOP_ON_MAIN_THREAD=false; end
p TkCore::RUN_EVENTLOOP_ON_MAIN_THREAD
require 'tk'
p TkCore::RUN_EVENTLOOP_ON_MAIN_THREAD
p TkButton.new:)text=>'TEST',:command=>proc{p 'test'}).packTk.mainloop
---------------------------------------------------------------
---------------------------------------------------------------
module TkCore; RUN_EVENTLOOP_ON_MAIN_THREAD=true; end
p TkCore::RUN_EVENTLOOP_ON_MAIN_THREAD
require 'tk'
p TkCore::RUN_EVENTLOOP_ON_MAIN_THREAD
p TkButton.new:)text=>'TEST',:command=>proc{p 'test'}).packTk.mainloop

Hi, sorry for the delay.
I've done everything you asked and here are the results.

After applying the patch you sent, the first example stalls like
usual, but the second one does not and it works perfectly well.

So I tried without the patch, and I got the same results: the first
case stalls, the second one works.

Finally I tried adding that one line to my code, and indeed now it
works perfectly well.

My environment is OS X 10.4.11, Ruby 1.9.1p0, Tk 8.4.7. And my
computer uses the old PowerPC CPU (a G4 to be exact).

Thanks a lot for the help
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

No members online now.

Forum statistics

Threads
473,755
Messages
2,569,536
Members
45,009
Latest member
GidgetGamb

Latest Threads

Top