Thread Sleep blockiert das Tk-Fenster (12 answers)
Opened by rommi at 2011-01-20 20:48

rommi
 2011-01-20 20:48
#144891 #144891
User since
2005-03-03
54 Artikel
BenutzerIn
[default_avatar]
Hallo Zusammen!

Ich möchte in einer while-Schleife und in bestimmten Intervallen (z.B. alle 10 Sekunden) Daten erzeugen und diese Daten in einem TK-Fenster (z.B. Text-Frame) ausgeben. Die Ausgabe und die Erzeugung soll jederzeit angehalten und fortgesetzt oder abgebrochen werden können. Ich hab es mal auf folgende Weise probiert:

Code (perl): (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
use Time::HiRes qw(sleep);
use Tk;
use Tk::Text;
use Tk::Scrollbar;

#================================ Variablen ===========================================================
$trigger = 0;

################################# TK-Abschnitt ########################################################
#================================ Hauptfenster ========================================================
$HF = new MainWindow ();
$HF->geometry('430x350');

#================================ Text-Frame ==========================================================
$Frame1 = $HF -> Frame(-width => 427, -height => 220,-borderwidth => 3, -relief => groove, -bg => black);
$Frame1->place(-x=> 2, -y=> 19);

$Textframe = $Frame1->Scrolled(Text, -wrap,none, -scrollbars => 'se', -height => 12, -width => 55, 
-bg => black, -fg => white)->pack(-expand => 'yes', -fill => 'both', -side => 'left');

#================================ Buttons =============================================================
$BtnStart = $HF->Button(-text=>"START",
                        -command => sub {$trigger = 0;erstell_daten();},
                        -borderwidth => 2,-relief => raised,-width => 14,
                        -font=>"Century 10");
$BtnStart->place(-x=> 2, -y=>260);

$BtnStop = $HF->Button( -text=>"STOP",
                        -command => sub {$trigger = 1;},
                        -borderwidth => 2,-relief => raised,-width => 14,
                        -font=>"Century 10");
$BtnStop->place(-x=> 140, -y=> 260);

$BtnQuit = $HF->Button( -text=>"Quit",
                        -command => sub{exit;},-width => 14, 
                        -borderwidth => 2,-relief => raised,
                        -font=>"Century 10");
$BtnQuit->place(-x=> 280, -y=> 260);

MainLoop();

################################# Ende TK-Abschnitt ###################################################

sub erstell_daten ()
{
         while(1)
         {
                  if($trigger eq 1){return}
                  sleep 1;              
                  $zaehler++;
                  $Textframe->insert("end", "\n$zaehler");
                  $HF->update();
         }
}


Das Problem ist aber dass der Sleep-Befehl sämtliche Tk-Funktionen zum "einfrieren" bringt. D.h. der Start-Button bleibt während der Sleep-Phasen(while-Schleife) hängen, das Tk-Fenster lässt sich während der Sleep-Phase nicht verschieben und und und. Weiss jemnad einen anderen Weg oder Tip wie ich das Problem umgehen kann?

Noch ne Frage zum Schluss. Kennt jemand die Seite perlboard.de? Die Seite scheint es nicht mehr zu geben oder was ist mit der Seite los?

View full thread Sleep blockiert das Tk-Fenster