Sie müssen Tk auch im Thread präsent sein; nur das Thread-Paket ist standardmäßig in untergeordneten Threads vorhanden:
thread::create {
package require Tk
while [tk_messageBox -message "Do you want to Exit?!!" -type yesno] {
doSomething
}
}
Außerdem müssen Sie eine Reihe von anderen Problemen in Ihrem Code zu beheben.
- immer stellen den Zustand eines
while
in {
Klammern }
. Ohne das werden die dynamischen Teile des Ausdrucks nur einmal ausgewertet, was mit einem while
wirklich nicht ist.
- Stellen Sie sicher, dass Ihr Thread
thread::wait
ausführt, da dies eine verbesserte Prozess- und Threadverwaltung ermöglicht. Ihre Nachrichtenboxschleife muss vollständig neu geschrieben werden.
Dies zu diesem Code führen könnte:
thread::create {
package require Tk
proc periodicallyMaybeDoSomething {} {
if {[tk_messageBox -message "Do you want to Exit?!!" -type yesno]} {
thread::exit
}
doSomething
# pick a better delay maybe?
after 1 periodicallyMaybeDoSomething
}
after 1 periodicallyMaybeDoSomething
thread::wait
}
Wenn Sie 8.6 verwenden sind, können Sie in der Lage sein Koroutinen verwenden Sie den Code ein eleganter zu machen. Donal
Danke - Versuchte es hat gut funktioniert und den Dialog geöffnet, aber beim Anklicken nicht zeigte Fehlerdialogfeld mit dem Inhalt stdout stdout ‚ nicht Kanal mit dem Namen finden‚„kann nicht Kanal mit dem Namen finden‘‘ während Ausführung‚setzt doSomething‘ (Prozedur "periodicallyMaybeDoSomething" Zeile 5) aufgerufen von innerhalb "periodicallyMaybeDoSomething" ("nach" Skript) " Irgendwelche Ideen, wie man auf stdout im Threadkörper bezieht – BabyGroot