LINUX.ORG.RU

Tcl/Tk и threads


0

4

Перерыл wiki.tcl.tk и не нашел ответа на казалось бы такой простой вопрос: как грамотно передавать информацию между тредом, в котором работает Tk GUI, и другим тредом, в котором в моем случае происходит работа с ком-портом. Суть такова: в отдельном потоке (дабы не замораживать интерфейс) я ловлю данные, приходящие на ком-порт. Когда они пришли, мне нужно их распарсить и вывести в главное окно. Можно, конечно, воспользоваться tsv::set — но тогда нужно как-то отслеживать, изменилась ли переменная, и парсить полученные данные в основном треде. Как в этом случае поступают умные люди?

А зачем тут морочиться с тредами? Переводишь порт в неблокирующий режим fconfigure $com_port -blocking 0 и ставишь обработчик входящих данных fileevent $com_port readable <script> . И ничего замерзать не будет. Или как вариант можно тупо запустить обработчик в цикле с помощью after в стороне от основной программы и периодически считывать из буфера порта что туда накапало. И так и так делал. Чтобы не замораживать, главное порт в -blocking 0 перевести.

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

А зачем тут морочиться с тредами? Переводишь порт в неблокирующий режим fconfigure $com_port -blocking 0 и ставишь обработчик входящих данных fileevent $com_port readable <script> .

У меня как раз -blocking 0 и выставлен, но с файлэвентами не разобрался. Беда в том, что работа с портом «не однообразная» — некоторые операции предполагают просто ожидание, при этом данные могут прийти в произвольный момент времени; а некоторые операции — подача команды и получение ответа на нее. Мне показалось, что в этом случае использование тредов уместно.

decadent
() автор топика
Ответ на: комментарий от elipse

Многоптоковые Tcl-сценарии

это уже классика

Дык читал. Но о взаимодействии с Tk там написан только один абзац, да и тот о том, что невозможно shared variables использовать в качестве -textvalue. А мне примерно это и надо :-)

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

Ну еще (для ориентира)
В лоб (без потоков) мне удавалось принимать на скорости 57 килобод поток по tty и обновлять графики на экране.

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

В лоб (без потоков) мне удавалось принимать на скорости 57 килобод поток по tty и обновлять графики на экране.

Но КАК?(с)

У меня в однопоточной версии на скорости 9600 во время приема данных (около килобайта) интерфейс «замораживается». Делать update после каждого полла ком-порта имхо нехорошо.

Вообще — на wiki.tcl.tk взаимодействие с внешними устройствами описано очень скупо. Я использую один из описанных там методов — периодический опрос. Работает нормально, за исключением вот этих «замораживаний» во время приема. Ну и иногда на команду внешнее устройство может не ответить — на время этого таймаута тоже «подмораживается» интерфейс.

decadent
() автор топика
Ответ на: комментарий от elipse

И там же смотрите раздел Save-Tcl

Не понял, это-то тут причем? Понятно, что создание треда запускает новый интерпретатор. Предлагаешь создавать алиасы для нужных переменных? Выглядит как-то не очень... Хотя посмотрю внимательнее, спасибо за наводку.

комбинаций и вариантов есть много. все зависит от задач и нагрузки.

Это ясно. Просто примеров понятных не нашел.

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

>Но КАК?(с)
Это надо смотреть исходники.
Чуть потом. Ok ?
ps: Давненько это уже было. По памяти не охота в дебри вас заводить.

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

Чуть потом. Ok ?

ps: Давненько это уже было. По памяти не охота в дебри вас заводить.

Договорились, заранее спасибо.

Если этот тред канет в бездну веков — мои контакты есть в профиле. Буду благодарен за любую информацию.

decadent
() автор топика
Ответ на: комментарий от elipse

Насколько я понял, у ТС происходит замораживание не из-за собственно чтения порта, раз он стоит в blocking 0, а во время обработки полученных данных, видимо, слишком тяжелая. Тогда да, лучше вынести в тред. Или оптимизировать обработку данных.

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

После чисток, вырезаний и борьбы с склерозом получилось что-то такое ))

Большое спасибо, нашел для себя новые вещи. Попробую так. Возможно, использование файлэвентов мне поможет.

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

Насколько я понял, у ТС происходит замораживание не из-за собственно чтения порта, раз он стоит в blocking 0, а во время обработки полученных данных, видимо, слишком тяжелая.

Не думаю, обработка происходит довольно быстро. А замораживание происходит в процессе приема — когда данные либо еще не пришли, а программа уже перешла в состояние приема, либо когда подана команда, а внешнее устройство не сразу на нее ответило.

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