[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