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