LINUX.ORG.RU

perl tk + threads


1

0

Хмм а вот в perl tk наблюдаются ужасные проблемы при использовании 
ithreads. Например:

my $text = $mw->Text(....);
threads->new(
  sub {
     my $wtf = <$sock>;
     $text->Insert($wtf);
  }

Что-нибудь в таком ключе (shared не нужен потому как $text референция. Проблемы таковы что выкидываются ужасные ворнинги и ерроры и иногда вся 
радость виснет и не обновляется Text.

Где-то вычитал что perl tk + threads не очень хорошая идея и если уже
то стоит запустить трэды в начале перед кодом Tk. К сожалению не 
провел эксперимента а заменил трэд на select и проблему решил 
(клепается упражнение для школы, поэтому забил на то что проблемы с 
чтением строки из сокета приводит к блокировке гуя.

Но все-таки чисто из интереса - как такие вещи делаются в perl tk?
Именно так то есть асинхроничным чтением откуда-то по кусочку?
Видел примеры в которых долгий код через какой-то промежуток 
времени прерывался и делал DoOneEvent(), то есть проблемы с
вишением где-то на файле или сокете или чем-то в этом роде
так и решаются - асинхронично?

Или таки есть иные способы писать неблокирующееся гуи для таких
случаев в perl tk?

Хмм а вот видел Tcl/Tk клиент для ICQ (alicq.sf.net), к сожалению 
беглый просмотр его скриптов не дал ответа на вопрос, надо 
разбираться долго и муторно, из кода сразу не видно как это 
сделано. В Tcl/Tk есть трэды? Из кода не понял. Может быть
кто-нибудь ориентируется в вопросе?

Вообще говоря, гуёвые треды -- плохая идея. Либо весь гуй в одном треде, а прочие шлют ему запросы, либо в лучшем случае натрахаешься с синхронизацией (а в реальном, подозреваю, уж лучше и не пытаться)

Не знаю, как в Линуксе, но в Винде и полумухе работа с окном из разных тредов, помнится, запрещена как класс...

С уважением -- Смоляное Чучелко

anonymous
()
Ответ на: комментарий от anonymous

Без трэда сложно сделать что-то такое:

Есть окно и есть кнопка. По нажатии на кнопку вызывается функция. Функция пишет в сокет. Сокету установлен таймаут достаточно долгий. Или например функция вызывает gethostbyname и висит ища это самое byname. Весь гуй завис и не реагирует на кнопки. Как решить?

Не всегда легко ингерировать в процесс этого самого gethostbyname или записи в сокет, чтобы через каждый промежуток времени делать DoOneEvent() чтобы передать управление окошку.

Вот и интересно как такие вещи обычно делаются например в perl/tk или в этой абстрактной концепции о которой ты говоришь?

dissident ★★
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.