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

Re: tcl/tk



On Wed, Sep 19, 2001 at 02:24:10PM +0400, Victor Wagner wrote:
> 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
> 
> 
> -- 
> To UNSUBSCRIBE, email to debian-russian-request@lists.debian.org
> with a subject of "unsubscribe". Trouble? Contact listmaster@lists.debian.org
> 



Reply to: