PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Perl/Tk: Automatische update der im Text-Widget gezegten Datei



TB09
04-04-2011, 09:48
Hallo zusammen,

ich habe mal wieder eine generelle Frage, deshalb auch kein Per-Code!

Ich möchte eine Text-Datei in einem text-Widget anzeigen. Die Datei wird jedoch von einem Programm als Log-Datei verwendet und ändert sich deshalb unter Umständen. Sobald eine Änderung des Files vom Programm vorgenommen wird, soll die Änderung auch im Text-Widget dargestellt werden.

Dabei möchte ich jedoch keine while-Schleife verwenden, da ich nicht das ganze Per-Skript anhalten möchte solange das File auf Änderungen überwacht wird, d.h. ich möchte das perl-GUI auch weiter nutzen können!

Kann mir jemand helfen? Evtl. auch mit Beispiel!

Besten Dank,

Thomas

Molaf
05-04-2011, 06:01
Hallo.

Vorschlag: ein repeat im GUI, mit dem regelmässig die Dateigröße und der Zeitpunkt der letzten Änderung genommen wird.
Wenn es was zu tun gibt, dann einfach die Datei neu durchgehen und den Rest anhängen.

Würde das das Probelm lösen?

Molaf

PS:ROText ist vielleicht für ro-Content besser geeignet.

TB09
05-04-2011, 07:12
Hallo Molaf,

zuerst einmal, besten Dank für deine Antwort.
Leider bin ich nicht wirklich fit, was Perl/Tk anbelangt, deshalb noch einige Frage zum repeat:

- Wie implementiere ich einen repeat, ohne dass das die Ausführung des
gesamten Scripts blockiert?
- Ist repeat eine Perl-Funktion?
- Kannst du mir vielleicht mit einem kurzen Beispiel weiterhelfen? Wäre echt
super!

Ich werde deinen Tipp mal aufnehmen und mich über ROText informieren!

Nochmals besten Dank!

Gruß,

Thomas

Molaf
05-04-2011, 09:09
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:

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

TB09
05-04-2011, 09:56
Ich probiere es so schnell wie möglich aus!

Vielen Dank für deine Bemühungen!

Gruß,

Thomas