Hello.
I trying to write a small GUI application.
I choose wxruby library.(any gui library with unicode is good for me)
My application use threads.
Next example is not work as expecting.
require ‘thread’
require ‘wx’
include Wx
class MinimalApp < App
def on_init
f=Frame.new(nil, -1,‘Test’)
f.show
end
end
Thread.new do
loop {
puts ‘hello’
STDOUT.flush
sleep(1)
}
end
MinimalApp.new.main_loop
After starting, ‘hello’ messages is show repeatly only when I drag the
window and
stops when I move the focus out.
What I missed ?
Regards,
Yuri Kozlov
Hello
Yuri Kozlov wrote:
Thread.new do
loop {
puts ‘hello’
STDOUT.flush
sleep(1)
}
end
MinimalApp.new.main_loop
I don’t know exactly how ruby’s threads interact with wx’s scheduling.
Perhaps you could try adding an evt_idle handler to your example?
For me this does what I’d expect: fire regularly and spawn and run
threads fine. What I didn’t expect, but that happened anyway, is that
your original long-running Thread now also seems to run regularly
regardless of app focus. Maybe add an explicit call to thread.run() in
the on_idle handler?
alex
require ‘thread’
require ‘wx’
class MinimalApp < Wx::App
def on_idle
Thread.new do
puts ‘FOO’
STDOUT.flush
sleep(1)
end
end
def on_init
evt_idle { on_idle }
f = Wx::Frame.new( nil, -1,‘Test’ )
f.show
end
end
$t = Thread.new do
loop {
puts ‘BAR’
STDOUT.flush
sleep(1)
}
end
MinimalApp.new.main_loop
Yuri Kozlov wrote:
What I missed ?
Ruby threads aren’t system threads. When you’re in the Wx main loop,
ruby isn’t getting called, so your thread doesn’t execute.
–
Neil S. - [email protected]
‘A republic, if you can keep it.’ – Benjamin Franklin
It seems, what this code make new thread every time when on_idle
called.
class MinimalApp < Wx::App
def on_idle
Thread.new do
puts ‘FOO’
STDOUT.flush
sleep(1)
end
end
Anyway, its not worked for me.
Thank you, Alex.
Regards,
Yuri Kozlov
Ruby threads aren’t system threads. When you’re in the Wx main loop,
ruby isn’t getting called, so your thread doesn’t execute.
Ok. I suspected like this.
Is exists gui library worked with ruby threads?
Or I must fork the new process, doing interprocess communication ?
Regards,
Yuri Kozlov
Aha.
Tkruby is much better.
October 13, subject “threading in win32” by Ara.T.Howard
require “tk”
thread_runner = lambda do
Thread::new do
loop {
puts ‘hello’
STDOUT.flush
sleep(1)
}
end
en
TkButton::new(nil,
“text” => “start thread/process”,
“command” => thread_runner).pack( “fill” =>“x”)
TkButton::new(nil,
“text” => ‘quit’,
“command” => lambda{exit}).pack(“fill” => “x”)
Tk::mainloop
The problem is solved.
Regards,
Yuri Kozlov
Could you post the full text working example ?
Thank you.
Regards,
Yuri Kozlov
Yuri Kozlov wrote:
It seems, what this code make new thread every time when on_idle
called.
Yes. It was just an example. If you want to run a previously defined
thread, the following works for me (CVS HEAD, Wx 2.6.2 unicode, OS X
10.3, Ruby 1.8.2)
def on_idle
@thread.run()
end
a
See below - note it doesn’t really matter where you create the thread -
it could be passed into the App’s constructor. It’s just in on_init for
simplicity.
a
require ‘thread’
require ‘wx’
class MinimalApp < Wx::App
def on_idle
@thread.run()
end
def on_init
@thread = Thread.new do
loop {
puts ‘HELLO’
STDOUT.flush
sleep 1
}
end
evt_idle { on_idle }
f = Wx::Frame.new( nil, -1,‘Test’ )
f.show
end
end
MinimalApp.new().main_loop
Not worked.
linux-i686 ruby 1.8.2 wx2.6.2 wxruby2 cvs
windows ruby 1.8.2 wx2.4 wxruby old.
I will use Tk library.
Thank you, Alex.
Regards,
Yuri Kozlov