[Date Prev][Date Next] [Thread Prev][Thread Next] [Date Index] [Thread Index]

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: