[Ruby] Tk.mainloop ест 99% cpu

Vladimir V. Zdorovenco halflife at moldova.cc
Thu Feb 6 14:16:45 MSK 2003


В письме от 6 Февраль 2003 13:17 Ihar Viarheichyk написал:

> > > так Ruby/Tk или Ruby/TclTk? как  я  понял  --  это  совсем  разные
> > > вещи.. и ежели ты  во  втором  копаешься  --  где  бы  читабельное
> > > описание найти? (кроме сырца)
> >
> > Не совсем, как я это понимаю: Tk - кнопки, чекбоксы и т.д - GUI Lib, а
> > Tcl для Ruby - интэрфейс к оному. В ProgrammingRuby о нем раздел есть,
> > Ruby/Tk FAQ, Ruby/Tk Tutorial, детального руководства именно для Ruby и
> > Tk я ненашел, авотры ProgrammingRuby ссылаются на Learning Perl/Tk или
> > Perl/Tk Pocket Reference книжки и описание как трактовать примеры на Perl
> > для тех кто с ним незнаком.
>
> Нет. Это независимые вещи. Tk - биндинги Tk-шных виджетов для Ruby, как
> в Perl/Tk. TclTk - это подключение интерпретатора Tcl/Tk, которому можно
> скармливать тиклевые команды на исполнение, как Tkiner в Python.

Да да, я несовсем корретно выразился, но суть в принцыпе одна и таже, ее 
выразить можно по разному. Вы лучше с mainloop помогите разобратся.

Вот что я нашел по этому поводу в ихнем мыллисте:

From: "Kero van Gelder" <kero at chello.nl>
Subject: Re: ANN: ruby 1.6.8
Date: Wed, 25 Dec 2002 10:01:13 +0900
Message-ID: <pan.2002.12.25.00.41.46.695026 at chello.nl>
kero> Ruby/Tk uses 100% CPU (as reported for a preview)
kero> worse, when using Tk 8.4, I don't see any window (works with Tk 8.3)

I know. But I don't have enough time and any idea to fix this problem. 
Of course, if use old Tk.mainloop, Ruby/Tk doesn't use 100% CPU, 
though some Ruby/Tk script will hang up. For example, some cases of 
following situation makes Ruby/Tk hanging up. 
--------------------------------------------------
 First, Tk calls Ruby (e.g. event callback).
 Then the event loop *waits* for Ruby operation. 
 The called Ruby calls Tk (e.g. treat Tk widget) and 
 waits for finishing Tk operation. 
 But to finish the Tk operation, the event loop must be running. 
--------------------------------------------------
Current Tk.mainloop starts a watch-dog thread. If the event loop is 
sleeping, the watch-dog thread starts new event loop. 

The old Tk.mainloop uses a timer for thread switching. Even if no Tk 
operations which waiting for proceeding, Ruby/Tk waits the time for 
thread switching. 
The current Tk.mainloop uses Tcl_DoOneEvent function with TCL_DONT_WAIT.
So, if no event is waiting, Ruby can do thread switching quickly. 
But if no other thread is running, the cost of Tcl_DoOneEvent loop may be
unreasonable. 

Do you have any good idea for the problem?

Оно всеравно ждет некоторое врямя пока tick_counter < event_loop_max так 
почему бы не заменить это таймером с очень маленьким интервалом убрав 
TCL_DONT_WAIT, скажем 20мс ? Всетаки получится нетак громоздко и в некоторых 
случаях выше описанное вовсе не является проблемой. Или определить какое-то 
правило с помощю которого можно будет выбрать подходящий _mainloop_ ?

-- 
Всего хорошего,
	Владимир (e-mail: halflife at moldova doc cc)

Get your personal e-mail for FREE at http://www.moldovacc.com






More information about the Ruby mailing list