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 [EMAIL PROTECTED] > 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 [EMAIL PROTECTED] > with a subject of "unsubscribe". Trouble? Contact [EMAIL PROTECTED] >