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

Vladimir V. Zdorovenco halflife at moldova.cc
Fri Feb 7 02:04:39 MSK 2003


В письме от 6 Февраль 2003 20:52 Dmitry Morozhnikov написал:

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

Вобщем я тоже не очень-то, просто представил себе ситуацию когда 
человек для которого ты чет там сделал скажет - "Как же это !?! Я видел 
программы и похлеще, им и 10% моего пупер-мега 100 гигагерцового прцессора 
хватало а тут твоё чудо все 100% слопалло!!" :) Наврядли ты отверетешся 
сказав - "Тут Супер технология - Ruby/Tk!!"

> впиливаю  --  где  проблема?  зачем  вообще  вся  эта  механика  с
> тредами, таймаутами понадобилась?

В кратцэ дело вот в чем и первое что надо уяснить это то что Ruby сам 
управляет тредами, это не то что представленно твоей OS, его собственный 
механизм. Исходя из такой структуры мы не можем получить полную 
самодеятельность внутри RubyExt модулей, например вызов sleep из модуля 
заблокирует Ruby до завершения sleep. Тоесть если мы хотим использовать треды 
надо об этом изначально позаботится, мало сказать:

Thread.new { моймодуль.sleep 100 }
10.times { print 'somphing' } # паралельное действие

Этого можно избежать например частыми опросами/повторами, например:

void sleep(int interval /* > 10 */) {
	int i= 0;
	while (i < interval) {
		sleep(1);
		rb_thread_schedule(); // передать управление другому потоку
		i+= 1;
	}
}
это плохой пример, можно сделать красивше, но суть думаю понятна ;)

Вот и съедает схожий цикл Tk.mainloop все сто, там нет задержек он просто все 
время крутится проверяя что Tcl_DoOneEvent сделал. Если ничего не сделал 
увеличивает свой счетчик на интервал безделия если делает на другой, в 
конечном итоге если тот превысит свою норму выставленную заранне, управление 
передается другому треду.

Вот хороший вопрос, и код Poll по ссылке:
http://lists.ruby-support.org/lists/pipermail/ruby-developers/2002-October/000058.html

а вот хороший на него ответ:
http://lists.ruby-support.org/lists/pipermail/ruby-developers/2002-October/000059.html

-- 
Всего хорошего,
	Владимир (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