2016-07-07 12 views
0

Ich habe einen einfachen Thread erstellt, um ein Meldungsfeld ständig anzuzeigen, bis der Benutzer keine Operation wünscht. Im Folgenden finden Sie den Code ein:Tcl/tk - wie mache ich ja keine messageBox in thread sichtbar

thread::create { while [tk_messageBox -message "Do you want to Exit?!!" -type yesno] { 
    doSomething 
}} 

Aber es gibt keine Meldung angezeigt, obwohl der Thread erstellt wird. Wie kann ich diese Nachrichtenboxen wirklich sehen?

Antwort

1

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.

  1. 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.
  2. 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

+0

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