Forum: wxRuby Application focus

Adfcc0aa1c939552971d7f56c9ef8dd9?d=identicon&s=25 Médéric Hurier (freaxmind)
on 2010-04-29 22:54
Hi there,

I'm developping an application based on xmpp4r and WxRuby to download
file between contacts. My application must handle incoming request and
manage all the file upload proccess.

Unfortunately, all proccess in Wx::App are active only if the
application has the focus or receive an event.
For example, I must move my cursor on the main window or click on it if
I want the user interface to be refreshed (contact go online/offline).

Is there a way to set that the Wx application must continue its actions
allthough it has not the focus ?

Thank you
3396e4a3df8a840faec520af8555a400?d=identicon&s=25 Mario Steele (Guest)
on 2010-04-29 23:27
(Received via mailing list)
Hello Hurier,

There is two ways in which you can do this.  The first method, is to use
a
Wx::Timer and Threads.  It depends on if you are using Ruby 1.9 or Ruby
1.8
in the method in which you can execute this.

If you are using Ruby 1.8

You create a Thread that will do your Xmppr processing, and then you
setup a
timer, that will after so many seconds or Milliseconds, does a Thread
switch, to allow other ruby threads to run.  You can find an example of
this
in my Sockets examples distributed with wxRuby.

If you are using Ruby 1.9

You can simply just create the Thread, and it will auto-context switch
for
you, as Ruby 1.9 uses native threads, instead of Soft Threads, as with
Ruby
1.8, hence for the work around provided in the sockets demo.

The second method in which to implement this, is to use the evt_idle
method
in your initialization method for your Window class, which will call the
method that handles the Xmppr processing, and occasionally checks for
Events
to be generated by the wxWidgets, by using Wx::App.pending?  Which
returns
true if events are pending, otherwise false.

Idle events are generated once for entering an Idle state.  So, if you
do
nothing with your app for a second, it will generate an idle event,
evt_idle
will execute once, and then it will wait for new events to occur.  When
a
new event occurs for anything, the event will fire, then it will wait
for a
second then generate another idle event.

The timing in the above explination is only an example, and does not
expressly garuntee that the idle event will execute 1 second after no
other
events occur.


hth,

Mario
Adfcc0aa1c939552971d7f56c9ef8dd9?d=identicon&s=25 Médéric Hurier (freaxmind)
on 2010-05-03 22:09
Thanks Mario, it's exacly that's I need ! I've used the Timer class and
set it in my main windows. It's work perfectly !

Thanks again for your accurate answer.
This topic is locked and can not be replied to.