Re: tcl/tk
On Wed, 19 Sep 2001, Mykola Golub wrote:
> Добрый день.
>
> У меня тут вопрос возник следующий. Как в tcl/tk сделать такую вот
> штуку:
>
> Нажимаю, например, я на кнопочку и у меня запускается
> процедура(процесс), но чтоб программа не ждала, когда этот процесс
> закончится, а можно было с ней работать дальше и к тому же, чтоб
> можно было на этот новый процесс влиять из основной программы
> (отменить, преостановить, изменить переменную и т.п.).
>
> Я вижу такое решение:
> Стелать этот процесс как отдельную программу myprog а потом
Разумный способ.
> button .ok -tekst ok -command {exec myprog &}
Можно еще
-command {set childpipe [open "|myprog r+"]}
и общаться через пайп. Естественно, придется на этот пайп fileevent-ы
повесить, чтобы обработка событий от интерфейса и от программы была
бы в едином цикле.
Данный подход, в отличие от send, позволяет запускаемой программе не
использовать Tk и слегка повышает портабельность. Т.е. на NT/2000 работать
будет, а на 95/98/ME - по-моему нет.
> send myprog {set flag 1}
>
> Мне не совсем нравиться такой вариант т.к.
> 1) непортабельно (насколько я знаю, в win нет send. Там что-то есть
> другое, но не хотелось бы себе так жизнь усложнять)
> 2) нужно будет экспортировать кучу переменных из основной программы в
> myprog.
> Может есть другая возможность?
Есть.
Если в выполняемой процедуре есть цикл с большим числом итераций,
и малым временем выполнения каждой итерации, то можно просто
в этот цикл воткнуть команду update.
Тогда каждый раз на этом месте выполнение процедуры будет
приостанавливатться и производиться обработка всех поступивших от
пользователя событий.
Еще можно сделать так - выполнять одну итерацию, а следующую запускать
на выполнение посредством after idle.
Семантика примерно та же - делаем кусок работы, а за следующий принимаемся
только тогда, когда обработаны поступившие за это время события.
Еще в принципе можно собрать Tcl с поддержкой нитей, но там оно устроено
так - одна нить - один интерпретатор. Т.е. вместо send ты получаешь
общение между интерпретаторами через interp eval, а вместо пайпов - memory
channels (для этого по-моему еще trf нужен).
--
Victor Wagner vitus@ice.ru
Chief Technical Officer Office:7-(095)-748-53-88
Communiware.Net Home: 7-(095)-135-46-61
http://www.communiware.net http://www.ice.ru/~vitus
Reply to:
- Follow-Ups:
- Re: tcl/tk
- From: Mykola Golub <golub@ifmpan.poznan.pl>
- References:
- tcl/tk
- From: Mykola Golub <golub@ifmpan.poznan.pl>