# TkCanvas on windows seems slow

**URL:** <https://www.ruby-forum.com/t/tkcanvas-on-windows-seems-slow/78985>\
**Category:** Ruby\
**Created:** [December 11, 2006, 9:29am UTC](https://www.ruby-forum.com/t/tkcanvas-on-windows-seems-slow/78985 "2006-12-11T09:29:04Z")\
**Posts on this page:** 3\
**Page:** 1

<div class="post-metadata">

**Author:** ![Joel\_VanderWerf](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/j/e19b73/32.png) [@Joel\_VanderWerf](https://www.ruby-forum.com/u/Joel_VanderWerf)\
**Post date:** [December 11, 2006, 9:29am UTC](https://www.ruby-forum.com/t/tkcanvas-on-windows-seems-slow/78985/1 "2006-12-11T09:29:04Z")

</div>

Hi, all,

On linux, I developed a little Tk animation using TkCanvas, and then I  
ran it on windows. It’s much slower on windows than on linux (maybe,  
5fps versus 30fps). Same machine, but ruby-1.8.4 on linux, 1.8.5 on  
windows.

The Windows Task Manager says the process is only using a tiny fraction  
of cpu, so that’s not the problem.

The canvas is currently just about a dozen objects, nothing special  
(polygons, lines, etc.).

It does have two threads, one doing Tk.mainloop, and one sending  
commands to the canvas. Increasing the priority of the command thread  
makes it worse: Tk doesn’t even seem to run–no windows. Decreasing the  
priority makes it even slower.

Nothing is waiting on terminal input (I know that’s a problem on  
windows).

I tried using a TkTimer instead, but couldn’t get it to work at all.

The ruby Tk animation demos seem to run fine, but they are simpler.

I realize this information is next to useless, unless someone has seen  
something very similar before.

Is there some setting that controls the rate at which widgets handle  
events?

Any ideas before I start chopping stuff out to get down to a small test  
case?

---

<div class="post-metadata">

**Author:** ![Joel\_VanderWerf](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/j/e19b73/32.png) [@Joel\_VanderWerf](https://www.ruby-forum.com/u/Joel_VanderWerf)\
**Post date:** [December 12, 2006, 6:04pm UTC](https://www.ruby-forum.com/t/tkcanvas-on-windows-seems-slow/78985/2 "2006-12-12T18:04:57Z")

</div>

Joel VanderWerf wrote:

> I tried using a TkTimer instead, but couldn’t get it to work at all.  
> …

Ok, I’ve got a workaround. I think the problem is that the command  
thread (the one sending commands to the canvas) isn’t getting enough  
chances to run.

The workaround is to fire a very frequent task from the mainloop to  
explicitly hand control to the command thread:

3.times do  
timer = TkTimer.new(1) do  
3.times {thread.run}  
end

timer.start  
end

The two threes was necessary on my system to get full CPU utilization.  
Reducing either one of them resulted in using less CPU and having a  
lower frame rate. The 1ms clock cycle also seems to be necessary.

With this workaround the animation runs at the same speed as on linux,  
about 60fps. That’s a lot better than the 6 fps without the hack.

I wish I knew whether this was a problem in ruby, tkruby, or windows…

Hope this helps someone else.

---

<div class="post-metadata">

**Author:** ![Joel\_VanderWerf](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/j/e19b73/32.png) [@Joel\_VanderWerf](https://www.ruby-forum.com/u/Joel_VanderWerf)\
**Post date:** [December 20, 2006, 7:20pm UTC](https://www.ruby-forum.com/t/tkcanvas-on-windows-seems-slow/78985/3 "2006-12-20T19:20:44Z")

</div>

From: Joel VanderWerf [removed\_email\_address@domain.invalid](mailto:removed_email_address@domain.invalid)  
Subject: Re: TkCanvas on windows seems slow  
Date: Wed, 13 Dec 2006 02:04:47 +0900  
Message-ID: [removed\_email\_address@domain.invalid](mailto:removed_email_address@domain.invalid)

> With this workaround the animation runs at the same speed as on linux,  
> about 60fps. That’s a lot better than the 6 fps without the hack.
> 
> I wish I knew whether this was a problem in ruby, tkruby, or windows…

I cannot understand how to reproduce your trouble.

# I don’t have environment for development on Windows.

# And I’m so busy now.

Can the following methods help you?

TclTkLib.set\_eventloop\_tick  
TclTkLib.set\_no\_event\_wait  
TclTkLib.set\_eventloop\_wait

( Please see ext/tk/MANUAL\_tcltklib.eng on Ruby’s source tree. )
