Hiho,
- Wie implementiere ich einen repeat, ohne dass das die Ausführung des
gesamten Scripts blockiert?
Wenn Tk die Kontrolle per MainLoop übernimmt, dann gibt es eigentlich kein kontinuierlich laufendes Script mehr. Ein dauerhaft laufendes Script könnte parallel zum Tk-Krams laufen, wenn du das Programm vorher mit fork oder mit Threads 'aufspaltest'. Also Script und Fensterkrams nebenher.
- Ist repeat eine Perl-Funktion?
perldoc -f repeat sagt nein 
repeat ist eine Methode von Tk/MainLoop.
- Kannst du mir vielleicht mit einem kurzen Beispiel weiterhelfen? Wäre echt
super!
Hier ein flinkes Beispiel:
Code:
use strict;
use warnings;
use Tk;
use Tk::ROText;
my $dat = {'dname'=>'C:/log-event.log',
'dtime' => 0,
'lines' => 0,
};
my $mw = MainWindow->new;
my $ro = $mw->Scrolled('ROText',
-scrollbars=>'ose',
-wrap=>'word',
-width=>80,
-height=>20,
-bg=>'white',
-font=>['small font',7],
)->pack(-fill=>'x');
# repeat ( [Zeit in ms] => [Subfunktion]
$mw->repeat(1000 => \&CheckAndFill);
MainLoop;
sub CheckAndFill
{# Nur ausführen, wenn 'atime' anders ist, als gemerkter Wert
if (-M $dat->{'dname'} != $dat->{'dtime'})
{# Logdatei öffnen
if (open my $log, '<encoding(utf8)', $dat->{'dname'})
{# Datei geöffnet, Zeilen überspringen, die schon eingelesen wurden
for(0..$dat->{'lines'})
{my $tmp = <$log>;}
# weitere Zeilen auslesen und nun auch verarbeiten
while(my $tmp = <$log>)
{# hinten im Textfeld die neuen Zeilen anfügen
$ro->insert('end', $tmp);
# Zeilen mitzählen fürs nächste mal Einlesen
$dat->{'lines'}++;
}
close $log;
# Nach unten scrollen, (wenn möglich/nötig)
$ro->yview('end');
# geänderte Dateieigenschaft 'atime' merken
$dat->{'dtime'} = -M $dat->{'dname'};
}
}
}
Hoffe das hilft.
Molaf
Lesezeichen