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

rommi
 2011-01-24 20:32
#144971 #144971
User since
2005-03-03
54 Artikel
BenutzerIn
[default_avatar]
Hallo Zusammen, mit repaet klappt es. Hier ein kurzes Beispiel-Script:

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
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
use Time::HiRes qw(sleep);
use Tk;
use Tk::Scrollbar;

#================================ Variablen ===========================================================
$trigger        = 0;
$max_zeilen     = 50;

################################# 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;$timer = $HF->repeat(200, sub{Ausgabe();})},
                         -font=>"Century 10");
$BtnStart->place(-x=> 2, -y=>260);

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


$BtnQuit = $HF->Button( -text=>"       QUIT       ",
                        -command => sub{exit;},
                        -font=>"Century 10");
$BtnQuit->place(-x=> 280, -y=> 260);

MainLoop();
################################# Ende TK-Abschnitt ###################################################

sub Ausgabe ()
{
                if($trigger eq 1)
                {
                        #======= Stoptext ausgeben
                        $Textframe->insert("end", "\nGestoppt");
                        
                        #===== Anzahl Ausgabe-Zeilen begrenzen
                        if($zaehler > $max_zeilen){$Textframe->delete('0.0', "2.0");}

                        #======= Ausgabefenster-Scrollbalken auf letzten Eintrag stellen
                        $Textframe->yview(moveto => '1.0');

                        #======= Timer canceln
                        $timer->cancel;

                        #======= Stop Sub
                        return;
                }
                
                $zaehler++;

                #===== Anzahl Ausgabe-Zeilen begrenzen
                if($zaehler > $max_zeilen){$Textframe->delete('0.0', "2.0");}

                #===== Scrollbalken auf den letzten Eintrag stellen
                $Textframe->yview(moveto => '1.0');

                $Textframe->insert("end", "\n$zaehler");
}


Mal ne Frage zu repeat. Ich hab irgendwo mal im web gelesen dass repeat einen Haufen Speichermüll verursacht? Weiss jemand darüber mehr und auf was muss man da aufpassen?

Jetzt hab ich noch ne zweite Möglichkeit mit thread versucht und folgendes Script zusammen gebastelt:
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
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
use Time::HiRes qw(sleep);
use threads;
use threads::shared;
use Tk;
use Tk::Scrollbar;
#======================================================================================================
#               Variablen belegen
#======================================================================================================
my $durchgaenge:shared  = 0;
my $infotext:shared     = "";
my $die:shared          = 0;

######################### T K - T E I L ###############################################################
#======================================================================================================
#               Hauptfenster
#======================================================================================================
$HF = new MainWindow ();
$HF->geometry('431x350');

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

$txtInfo = $FrInfo->Scrolled(Text,-wrap,none,-bg => black,-foreground => white,-scrollbars => 'se',
-height => 14,-width => 60, -font => "times -16 bold")->pack(-expand => 'yes', -fill => 'both', -side => 'left');

#========================================================================================================
#               Buttons
#========================================================================================================
$BtnStart = $HF->Button(-text           =>"START",
                        -command        => sub {$die = 0;start_thread();$BtnStop->configure(-state=>'active');$timer = $HF->repeat(100,sub{});},
                        -width          => 14,
                        -font           =>"Century 10");
$BtnStart->place(-x=> 2, -y=>260);

$BtnStop = $HF->Button( -text=>"STOP",
                        -command        => sub {$die = 1;$BtnStop->configure(-state=>'disabled');$timer->cancel();},
                        -width          => 14,
                        -state          => 'disabled',
                        -font           =>"Century 10");
$BtnStop->place(-x=> 140, -y=> 260);

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

MainLoop();
######################### ENDE T K - T E I L ##########################################################

sub start_thread()
{
        $thread = threads->create( \&start );
        $thread->detach;
}

sub start
{
         while(1)
         {
                if($die){return}
                sleep 0.2;      
                $durchgaenge++;

                #===== Scrollbalken auf den letzten Eintrag stellen
                $txtInfo->yview(moveto => '1.0');

                #===== Ausgabetext in Ausgabefenster schreiben
                $txtInfo->insert("end", "$durchgaenge\n");
         }
}


Allerdings krieg ich hier die Fehlermeldung "Attempt to free non-existent shared string '_TK_RESULT_'". Hängt scheinbar damit zusammen dass ich im Thread-Teil einen Tk-Teil anspreche. Anonsten würde es über thread auch funktionieren. Wäre ne Alternative?!

Was mit perboard.de los ist weiss niemnad hier? Ich frage nur weil ich da auch mal vor einiger Zeit ein paar Fragen gestellt habe und wollte mir meine Fragen nochmal anschauen, aber die scheinen garnicht mehr online zu sein...

gruss, rommi

View full thread Sleep blockiert das Tk-Fenster