habe folgendes Problem:
Ein Maschinen-PC (mit WinNT OS) schreibt (quasi-) kontinuierlich Log-Daten auf die Festplatte (ca. 3MB pro Tag). Jetzt möchte ich möglichst Zeit nah mit einem Lazarusprogramm die aktuellen Daten (letzte 1 – 15 Sekunden) nach einem Schlüsselwort durchsuchen, um ein Ereignis auszulösen. Hierzu lade ich den gesamten Log-File in eine StringListe. In dem Timer-Event des Testprogramms:
Code: Alles auswählen
procedure TForm1.Timer1Timer(Sender:TObject);
var i,zl :integer;
sl :TStringList;
begin
Screen.Cursor:=crHourGlass;
inc(zaehler);
Label1.Caption:=IntToStr(zaehler);
ListBox1.Clear;
sl:=TStringList.Create;
try
sl.LoadFromFile(fname); {fname = Filename}
zl:=sl.Count-1; {tail =20}
if zl>tail then for i:=zl downto zl-tail do ListBox1.Items.Add(sl.Strings[i])
else for i:=zl downto 0 do ListBox1.Items.Add(sl.Strings[i]);
finally
sl.Free;
end;
Screen.Cursor:=crDefault;
end;
werden die letzten (tail=20) Zeilen des Log-Files in eine Listbox/StringList übertragen. Hier kann dann nach dem Schlüsselwort gesucht werden. Wird das Timer.Interval zu klein gewählt, dann gibt es eine Zugriffsverletzung auf den Log-File (siehe Fehlermeldung)
Nun dachte ich, die Zugriffsverletzung könnte ich durch den try-finally-end Block abfangen. Leider ohne Erfolg.
Wer hat eine Idee, um die Zugriffsverletzung zu vermeiden?
Geruß, Linkat