LINUX.ORG.RU

Tk, реакция на события


0

0

Добрый вечер. Подскажите пожалуйста, как в таком скрипте заставить детали формы - кнопки - реагировать на события во время простоя.
При "after 5000" форма замирает, а при постоянной работе - жрёт процессор.

proc getstat {} {
        set fread [open plst r]
        set sock [socket X.X.X.X 5038]
        puts $sock "Action: Login"
        puts $sock "Username: admin"
        puts $sock "Secret: xxxxxxx\n"
        while {[gets $fread p] > 0} {
                puts $sock "Action: Sipshowpeer"
                puts $sock "Peer: $p\n\n"
                flush $sock
                while {([gets $sock line] >= 0) && ($line!="Response: Error")} {
                        if {([lindex $line 0] == "Status:") && ([lindex $line 1] == "OK")} {
                                .l$p configure -bg green
                                update
                        } elseif {[lindex $line 0] == "Status:"} {
                                .l$p configure -bg red
                                update
                        }
                }
        }
        after 5000
        getstat
}

proc labels {} {
        set fread [open plst r]
        while {[gets $fread p] > 0} {
                button .l$p -text $p -bg red
                pack .l$p -fill x
                bind . <Escape> {exit}
        }
}

labels
getstat
anonymous

на чём именно оно у тебя замирает ? сам по себе рекурсивный вызов getstat тум асинхронный, причин вешать Tk нет

jtootf ★★★★★
()
Ответ на: комментарий от jtootf

>>на чём именно оно у тебя замирает ? сам по себе рекурсивный вызов getstat тум асинхронный, причин вешать Tk нет

Bind <Escape> и закрытие (уничтожение) формы работают только после выполнения "after 5000", а значит, очень краткий промежуток времени.

anonymous
()
Ответ на: комментарий от anonymous

Ну и конечно fconfigure $fread -blocking 0

anonymous
()
Ответ на: комментарий от anonymous

>Наверное, все-таки: after 5000 getstat - в одной строке.
Спасибо, анонимный брат, уже догадался.
В таком случае не виснет. 

>hint: ипсользовать неблокирующее чтение/запись, то есть юзать fileevent

*грустный смайлик*
А где и зачем здесь можно использовать fileevent, а?

anonymous
()
Ответ на: комментарий от anonymous

Да тут даже fileevent и не надо, коль цикл по after уже есть.

Главное сделать fconfigure $fread -blocking 0 тогда он не будет блокировать приложение на время чтения сокета.

И, тогда подумай, наверное, можно сделать так шиворот-навыворот: в начале процедуры проверки статуса вычитывать сокет и проверять статус, а уже после того - отправлять хосту запрос статуса и отправляемся на покой на 5 сек. Смысл? А смысл в том, что мы отправляем запрос и даем на ответ 5 сек, только потом проверяем, уж за это время-то он должен ответить, ну а если не ответил, ну тогда алярм. Не нужен цикл while ожидания ответа после запроса.

anonymous
()
Ответ на: комментарий от anonymous

Буду много думать, спасибо.

anonymous
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.