AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Sprachen und Entwicklungsumgebungen Object-Pascal / Delphi-Language Delphi Problem mit StringList.SaveToFile im Thread
Thema durchsuchen
Ansicht
Themen-Optionen

Problem mit StringList.SaveToFile im Thread

Ein Thema von smudo · begonnen am 29. Sep 2005 · letzter Beitrag vom 29. Sep 2005
Antwort Antwort
smudo

Registriert seit: 6. Sep 2005
Ort: Cottbus
362 Beiträge
 
Delphi XE2 Professional
 
#1

Problem mit StringList.SaveToFile im Thread

  Alt 29. Sep 2005, 15:11
Hallo ,

ich möchte das Loggen meiner Anwendung über einen Thread lösen.
Delphi-Quellcode:
//Schreibt den LogPuffer solange nicht mit DoStop abgebrochen wurde
procedure TLogThread.DoWait;
begin
  while (PStop=False) or //eine Abbruchvariable
        (PLogPuffer.Count>0) do //StringList enthält die zu loggenden Zeilen
  begin
    if (PLogPuffer.Count>0) then
    begin
      WriteLog(PLogPuffer[0]); //schreibt eine Zeile <--hier knallts manchmal
      PLogPuffer.Delete(0); //löscht diese Zeile
    end;
  end;
end;
In WriteLog wird wiederum eine StringList PLogs gefüllt. Sollte eine bestimmte Zeilenanzahl erreicht sein,
wird die erste Zeile gelöscht. --> enthält also nur die x aktuellsten Zeilen.
Letztendlich soll mit PLogs.SaveToFile die Liste der aktuellsten Logs gespeichert werden (die Liste wird also bei jedem Loggen komplett gespeichert) und dabei kommt es, wenn viele Log-Einträge schnell hintereinander geschrieben werden, ab und an zum Crash (Auf die Datei kann nicht zugegriffen werden).

Was passiert da und wie kann ich dem entgegenwirken?

Vielen Dank

René
  Mit Zitat antworten Zitat
Benutzerbild von Union
Union

Registriert seit: 18. Mär 2004
Ort: Luxembourg
3.492 Beiträge
 
Delphi 7 Enterprise
 
#2

Re: Problem mit StringList.SaveToFile im Thread

  Alt 29. Sep 2005, 16:20
Zitat von smudo:
Hallo ,

ich möchte das Loggen meiner Anwendung über einen Thread lösen.
Delphi-Quellcode:
//Schreibt den LogPuffer solange nicht mit DoStop abgebrochen wurde
procedure TLogThread.DoWait;
begin
  while (PStop=False) or //eine Abbruchvariable
        (PLogPuffer.Count>0) do //StringList enthält die zu loggenden Zeilen
  begin
    if (PLogPuffer.Count>0) then
    begin
      WriteLog(PLogPuffer[0]); //schreibt eine Zeile <--hier knallts manchmal
      PLogPuffer.Delete(0); //löscht diese Zeile
    end;
  end;
end;
In WriteLog wird wiederum eine StringList PLogs gefüllt. Sollte eine bestimmte Zeilenanzahl erreicht sein,
wird die erste Zeile gelöscht. --> enthält also nur die x aktuellsten Zeilen.
Letztendlich soll mit PLogs.SaveToFile die Liste der aktuellsten Logs gespeichert werden (die Liste wird also bei jedem Loggen komplett gespeichert) und dabei kommt es, wenn viele Log-Einträge schnell hintereinander geschrieben werden, ab und an zum Crash (Auf die Datei kann nicht zugegriffen werden).

Was passiert da und wie kann ich dem entgegenwirken?

Vielen Dank

René
Du musst Deine Threads synchronisieren. Schau mal nach unter Delphi-Referenz durchsuchenInitializeCriticalSection, [oh]DeleteCriticalSection,[/oh] Delphi-Referenz durchsuchenEnterCriticalSection, Delphi-Referenz durchsuchenLeaveCriticalSection.
Ibi fas ubi proxima merces
sudo /Developer/Library/uninstall-devtools --mode=all
  Mit Zitat antworten Zitat
smudo

Registriert seit: 6. Sep 2005
Ort: Cottbus
362 Beiträge
 
Delphi XE2 Professional
 
#3

Re: Problem mit StringList.SaveToFile im Thread

  Alt 29. Sep 2005, 16:32
Hallo Union,

vielen Dank schon wieder mal.
Deine Suchbegriffe konnte ich zwar nicht finden,
mir fiel dabei aber das Zauberwort Synchronize ein.
Einfach die DoWait-Methode mit Synchronize aufgerufen und schon kommt kein Fehler mehr.

Trotzdem weiß ich noch nicht, was vorher passierte. Hat sich der Thread selbst überholt?
  Mit Zitat antworten Zitat
Benutzerbild von Union
Union

Registriert seit: 18. Mär 2004
Ort: Luxembourg
3.492 Beiträge
 
Delphi 7 Enterprise
 
#4

Re: Problem mit StringList.SaveToFile im Thread

  Alt 29. Sep 2005, 16:36
Zitat von smudo:
Hallo Union,

vielen Dank schon wieder mal.
Deine Suchbegriffe konnte ich zwar nicht finden,
mir fiel dabei aber das Zauberwort Synchronize ein.
Einfach die DoWait-Methode mit Synchronize aufgerufen und schon kommt kein Fehler mehr.

Trotzdem weiß ich noch nicht, was vorher passierte. Hat sich der Thread selbst überholt?
Ganz Einfach, Thread 1 hat gerade WriteLog durchgeführt und will gerade Delete ausführen. Genau in der Millisekunde prüft Thread 2 mit Count > 0 und kommt noch in die Schleife, übergibt die Adresse von PLogBuffer an WriteLog... und in diesem Augenblick wird Delete ausgeführt. Dann zeigt die eben noch gültige Adresse ins Nirvana.

P.S. Die angegebenen Funktionen sind WINAPI-Funktionen.
Ibi fas ubi proxima merces
sudo /Developer/Library/uninstall-devtools --mode=all
  Mit Zitat antworten Zitat
smudo

Registriert seit: 6. Sep 2005
Ort: Cottbus
362 Beiträge
 
Delphi XE2 Professional
 
#5

Re: Problem mit StringList.SaveToFile im Thread

  Alt 29. Sep 2005, 16:52
Übrigens,

besser ist es, nicht DoWait schon mit Synchronize aufzurufen, sondern erst WriteLog.
Das verlangsamt den Thread zwar sehr, aber im ersten Fall kam es vor, dass das zu loggende Programm nicht mehr startete,
wahrscheinlich weil der Thread im Create des Formulars (vor dem Application.Run) gestartet wurde.
Schlussfolgere ich das richtig?
  Mit Zitat antworten Zitat
Benutzerbild von Union
Union

Registriert seit: 18. Mär 2004
Ort: Luxembourg
3.492 Beiträge
 
Delphi 7 Enterprise
 
#6

Re: Problem mit StringList.SaveToFile im Thread

  Alt 29. Sep 2005, 16:59
Zitat von smudo:
Übrigens,

besser ist es, nicht DoWait schon mit Synchronize aufzurufen, sondern erst WriteLog.
Das verlangsamt den Thread zwar sehr, aber im ersten Fall kam es vor, dass das zu loggende Programm nicht mehr startete,
wahrscheinlich weil der Thread im Create des Formulars (vor dem Application.Run) gestartet wurde.
Schlussfolgere ich das richtig?
Dur solltest die zu synchronisierenden Sektionen natürlich möglichst kurz halten. Es sollten also die zwei Zeilen (WriteLog, Delete) zu einer Sektion zusammengefasst werden. Oder Du erweiterst entsprechend WriteLog(blabla, bDelete). Und wenn bDelete = true wird gleich innerhalb der Funktion gelöscht.
Ibi fas ubi proxima merces
sudo /Developer/Library/uninstall-devtools --mode=all
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 05:43 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz