Anzeige:
Ergebnis 1 bis 5 von 5

Thema: Perl/Tk: Automatische update der im Text-Widget gezegten Datei

  1. #1
    Registrierter Benutzer
    Registriert seit
    09.06.2009
    Beiträge
    37

    Exclamation Perl/Tk: Automatische update der im Text-Widget gezegten Datei

    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

  2. #2
    Registrierter Benutzer Avatar von Molaf
    Registriert seit
    15.11.2004
    Beiträge
    127
    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.

  3. #3
    Registrierter Benutzer
    Registriert seit
    09.06.2009
    Beiträge
    37
    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

  4. #4
    Registrierter Benutzer Avatar von Molaf
    Registriert seit
    15.11.2004
    Beiträge
    127
    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

  5. #5
    Registrierter Benutzer
    Registriert seit
    09.06.2009
    Beiträge
    37
    Ich probiere es so schnell wie möglich aus!

    Vielen Dank für deine Bemühungen!

    Gruß,

    Thomas

Stichworte

Lesezeichen

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •