Forum: wxRuby Second thread working at slow speed

Posted by Chase Wilson (remosewa)
on 2010-07-08 00:42
I have program that does a bunch of file processing and the GUI froze up
every time I ran it. I decided to do the trick of running my main code
in a second thread and using the timer to update the gui every 100 ms.
However, the problem is that the second thread that I run is working but
very very slowly. Much slower than how it normally works.

I have the timer:
      timer = Timer.new(self,ID_ANY)
      evt_timer(timer.id) {Thread.pass}
      timer.start(1000)

my second thread:
newthread = Thread.new do
        create_prompt_data
        create_groups
        create_xls
      end
Posted by Mario Steele (Guest)
on 2010-07-08 01:28
(Received via mailing list)
That's cause whenever you pass the thread to another Ruby thread, it 
takes
time away from the main thread.  And since your Processing code is in a
Secondary Thread, it gets less time then the Main Thread.
Posted by Chase Wilson (remosewa)
on 2010-07-08 08:07
Mario Steele wrote:
> That's cause whenever you pass the thread to another Ruby thread, it 
> takes
> time away from the main thread.  And since your Processing code is in a
> Secondary Thread, it gets less time then the Main Thread.

No no, before I had created the second thread my computer would process 
the data and have a ton of CPU usage. Now with the thread it runs, but 
very very slowly and hardly any CPU usage.
Posted by Alex Fenton (Guest)
on 2010-07-08 10:24
(Received via mailing list)
On 07/07/2010 23:42, Chase Wilson wrote:
> I have program that does a bunch of file processing and the GUI froze up
> every time I ran it. I decided to do the trick of running my main code
> in a second thread and using the timer to update the gui every 100 ms.
>    

Is there any way you can break up the file processing into small
discrete tasks? If so, you could could have a queue of jobs and consume
them one at a time in an evt_idle loop. This is a more efficient (and
simpler) way of keeping the GUI responsive whilst handling long-running
tasks.

Ruby 1.8 green threads + Wx::Timer has some overhead (thread context
switching) and isn't that efficient - it forces switching to the GUI
thread when updates aren't needed.
> However, the problem is that the second thread that I run is working but
> very very slowly. Much slower than how it normally works.
>
> I have the timer:
>        timer = Timer.new(self,ID_ANY)
>        evt_timer(timer.id) {Thread.pass}
>        timer.start(1000)
>    

This is switching context every 1000ms - i.e. every second. Did you mean

timer.start(10)

or  (simpler, if you don't need later control)

Timer.every(10) { Thread.pass }

alex
Please log in before posting. Registration is free and takes only a minute.
Existing account (Switch to SSL-encrypted connection)
NEW: Do you have a Google/GoogleMail or Yahoo account? No registration required!
Log in with Google account | Log in with Yahoo account
No account? Register here.