Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi hungapp nach relativ kurzer Zeit (https://www.delphipraxis.net/132263-hungapp-nach-relativ-kurzer-zeit.html)

zeras 8. Apr 2009 22:25


hungapp nach relativ kurzer Zeit
 
Hallo,

ich schreibe gerade ein Programm mit Threads und dort kommt es in unregelmäßigen Zeiträumen zum Absturz des Programms. Dann kommt Windows Fehlermeldung "hungapp", womit ich überhaupt nichts anfagen kann.
Wie kann ich hier weitersuchen, um das Problem zu lösen?
Es sollte doch möglich sein, neben dem laufenden Thread das Programm normal bedienen zu können oder nicht?
Ich nutze eine kleine Datenbank mit Midas.dll, aber das sollte ja eigentlich auch kein Problem sein?

Für jede Hilfe bin ich dankbar.

jaenicke 8. Apr 2009 22:48

Re: hungapp nach relativ kurzer Zeit
 
Allgemein ist es da nicht einfach etwas dazu zu sagen.

Greifst du vielleicht aus dem Thread heraus auf die visuellen Komponenten auf einem Formular zu oder erzeugst du da Objekte, die du dann außerhalb verwendest?

zeras 9. Apr 2009 06:25

Re: hungapp nach relativ kurzer Zeit
 
die meisten Sachen laufen innerhalb des Threads. Ich habe aber ein Memo, wo ich den ganzen Verlauf mitlogge, was im Thread passiert.

Beispiel, welches im Thread des Öfteren aufgerfuen wird:

Delphi-Quellcode:
   fMain.MeLog.Lines.Add(s);
Wenn ich das nicht dürfte, dann müßte ich mir wahrscheinlich eine Stringlist erzeugen, in die ich dann alle Logs eintrage und dann am Ende im Synchronize dann an das Memo einfüge. Wäre das eine saubere Lösung, wie hier unten?

Delphi-Quellcode:
   Synchronize(UpdateCaption);

Ich suche auch in einer Datenbank mittels ClientDataSet, aber das sollte doch kein Problem sein, da ich nichts auf ein Formular schreibe.


Wo kann ich mehr über Threads erfahren, wo solche Themen aufgelistet sind?

alzaimar 9. Apr 2009 07:04

Re: hungapp nach relativ kurzer Zeit
 
Der unkontrollierte Zugriff auf die Memo-Komponente ist der Grund für deine sporadischen 'Hänger'.

Ich würde Dir empfehlen, eine Logging-Klasse zu schreiben. Hier ein Vorschlag:
Delphi-Quellcode:
uses
  SyncObjs;
Type
  TLogger = Class (TThread)
  private
    fMsg : String;
    fCS : TCriticalSection;
    fLogStrings : TStringlist;
    fMemo : TMemo;
    Procedure DoAddToLog;
  protected
    Procedure Execute; Override;
  public
    Constructor Create (aMemo : TMemo);
    Procedure Log (Const aMessage : String);
    destructor Destroy; override;
  End;

Constructor TLogger.Create (aMemo : TMemo);
Begin
  Inherited Create(True);
  fCS := TCriticalSection.Create;
  fLogStrings := TStringList.Create;
  fMemo := aMemo;
End;

Procedure TLogger.Log (Const aMessage : String);
Begin
  fCS.Enter;
  Try
    fLogStrings.Add(DateTimeToStr(Now)+': '+aMessage);
    If Suspended Then Resume;
  Finally
    fCS.Leave;
  End;
End;

Procedure TLogger.Execute;
  Function _ExtractString : Boolean;
  Begin
    fCS.Enter;
    Try
      If fLogStrings.Count > 0 Then Begin
        fMsg := fLogStrings[0];
        fLogStrings.Delete (0);
        Result := True;
      End
      Else
        Result := False;
    Finally
      fCS.Leave;
    End
  End;

Begin
  While not Terminated Do Begin
    If _ExtractString Then
      Synchronize(DoAddToLog)
    Else
      Suspend;
  End
End;

Procedure TLogger.DoAddToLog;
Begin
  fMemo.Lines.Add(fMsg);
End;

Destructor TLogger.Destroy;
Begin
  fCS.Free;
  fLogStrings.Free;
End;

Sven M. 9. Apr 2009 07:20

Re: hungapp nach relativ kurzer Zeit
 
Zitat:

Zitat von zeras
die meisten Sachen laufen innerhalb des Threads. Ich habe aber ein Memo, wo ich den ganzen Verlauf mitlogge, was im Thread passiert.

Beispiel, welches im Thread des Öfteren aufgerfuen wird:

Delphi-Quellcode:
   fMain.MeLog.Lines.Add(s);
Wenn ich das nicht dürfte, dann müßte ich mir wahrscheinlich eine Stringlist erzeugen, in die ich dann alle Logs eintrage und dann am Ende im Synchronize dann an das Memo einfüge. Wäre das eine saubere Lösung, wie hier unten?

Delphi-Quellcode:
   Synchronize(UpdateCaption);

Auch das Schreiben in eine TStringList wird dir hier nichts bringen, denn auch diese ist Teil der VCL und somit nicht threadsicher. Grundsätzlich müssen alle Interaktionen mit der VCL mittels der Methode "Sychronize" synchronisiert werden.
Threads lohnen sich daher (fast) nur bei wirklich aufwendigen, zeit- und rechenintensiven Prozessen.

zeras 9. Apr 2009 08:55

Re: hungapp nach relativ kurzer Zeit
 
@ alzaimar

Ich habe dies mal eingebaut und bin am Testen.

Ich sage schon mal vielen Dank im Voraus.

Mich wundert es nur, dass mein Programm bis vor kurzer Zeit eigentlich stabil lief und nun habe ich nur ein wenig erweitert und es kommt zu solchen Hängern. Aber bis jetzt läuft es nun eine halbe Stunde ohne "Hänger".


Nur noch eine Frage: Bedeutet das, dass ich im Thread keine TStringlist nutzen kann? Ich brauche dies immer nur innerhalb einer Funktion Bsp.

Delphi-Quellcode:

function GetManu(fname:string):string;
var

  T       : TStringList;

begin
  result:='';

  T:=TStringList.create;
  try
    T.LoadFromFile(sRenamed);

    //do something

  finally
    T.Free;
  end;
end;
Darf ich sowas auch nicht im Thread nutzen?


@Sven M.

Ich weiß im Moment keine andere Lösung. Ich brauche eigentlich zwei Programme, einen Dienst und ein Adminprogramm. Im Dienst müßten die zyklischen Sachen laufen und im Admin dann die Visu. Da ich mit Diensten noch nichts gemacht habe, lasse ich diesen Teil im Thread im Visuprogramm laufen. Ansonsten müßte ich einen Timer setzen, der jede Sekunde was macht. Finde ich aber nicht so gut, wenn mal das zyklische Programm länger als eine Sekunde läuft.

jaenicke 9. Apr 2009 13:49

Re: hungapp nach relativ kurzer Zeit
 
Zitat:

Zitat von zeras
Mich wundert es nur, dass mein Programm bis vor kurzer Zeit eigentlich stabil lief und nun habe ich nur ein wenig erweitert und es kommt zu solchen Hängern. Aber bis jetzt läuft es nun eine halbe Stunde ohne "Hänger".

Das sind eben zufällige Effekte, die auftreten können, aber nicht müssen.

Zitat:

Zitat von zeras
Nur noch eine Frage: Bedeutet das, dass ich im Thread keine TStringlist nutzen kann? Ich brauche dies immer nur innerhalb einer Funktion Bsp.

Wenn du die TStringList nur innerhalb des selben Threads benutzt, wird es keine Probleme geben. Das im Thread erzeugte Objekt solltest du natürlich nicht außen weiternutzen (wäre aber ja ohnehin unsauber), aber solange es nur zum Weitergeben des Inhalts innerhalb von Synchronize benutzt wird, sollte es auch keine Probleme geben.

Und noch was in dem Zusammenhang: Eine visuelle Komponente oder z.B. auch ein TBitmap-Objekt darf nie im Thread erzeugt und dann nach außen weitergereicht und dort weiter verwendet werden.

// EDIT:
Auch TClientDataSet ist doch eine Komponente auf dem Formular? Dann kann es dabei auch Probleme geben, insbesondere, wenn es parallele Zugriffe darauf gibt. Wie die Komponente da genau aussieht weiß ich nicht, es kann also auch gut gehen, aber sauber ist das nicht.

zeras 9. Apr 2009 14:10

Re: hungapp nach relativ kurzer Zeit
 
Die Stringlists nutze ich nur innerhalb der Rotuine. Zum Weitergeben an Informationen habe ich ein Array definiert, wo dann entsprechende Werte gesetzt werden.

Nur mit der TClientDataSet Komponente weiß ich dann nicht, wie ich das machen soll. Ich suche mir einen Datensatz raus verarbeite den Inhalt dann im Thread weiter. Oder ich bekomme eine Info über einen zu schreibenden Datensatz. Das Hauptprogramm läuft ja nicht zyklisch. Oder ich müßte im Hauptprogramm einen Timer setzen, der jede Sekunde nachschaut, ob der Thread für TClientDataSet was zu tun hat (Über einen Merker irgendwie). Das ist bestimmt auch nicht die beste Alternative.

jaenicke 9. Apr 2009 14:25

Re: hungapp nach relativ kurzer Zeit
 
Da TClientDataSet keine richtige visuelle Komponente ist, bin ich mir nicht sicher wie gefährlich das ist. Denn die Probleme treten ja dadurch auf, dass parallele Zugriffe passieren. Bei einer solchen Komponente, die ja nur als Icon auf dem Formular liegt, kommt es darauf an, ob da so etwas passieren kann.

Da sollte vielleicht jemand anderes etwas zu sagen, ich kenne die Komponente nicht besonders gut.

Grundsätzlich ist die BDE ohnehin keine sinnvolle Lösung mehr. Da du das jetzt so drin hast und vermutlich auch oft im Projekt benutzt, ist es vermutlich zu spät das kurzfristig zu ändern, aber für neue Projekte ist die BDE jedenfalls nicht mehr geeignet. Denn die wird seit 8 Jahren nicht mehr weiterentwickelt und muss ja auch mit einem Projekt immer mit installiert werden.

Im Gegensatz zu neueren Lösungen, die noch weiterentwickelt werden und (allerdings vor allem für kleinere Projekte) auch als embedded Variante existieren.

zeras 9. Apr 2009 14:30

Re: hungapp nach relativ kurzer Zeit
 
Ja wegen der TClientDataSet. Ich habe das genutzt, weil es sehr einfach zu implementieren war und auch nur als Desktoplösung angedacht ist. Die Daten liegen zwar auf einem Server, aber der Zugriff sollte eigentlich nur von einem Programm getätigt werden. Man will zwar jetzt auch von einem anderen Rechner lesend auf die Daten zugreifen, aber ich denke, dass ich bei TClientDataSet auch auf "readonly" stellen kann. Ansosnten müßte ich mich mal mit einer anderen Lösung beschäftigen. Da habe ich aber noch keine Erfahrungen, wie man das mit einer serverbasierten Lösung macht. Wahrscheinlich muss man dann einen extra Rechner mit einem Serverprogramm nutzen, der dann Daten bereitstellt oder empfängt, aber wie gesagt, bis jetzt habe ich keine Erfahrungen damit (außer ein wenig PHP und Mysql).


Alle Zeitangaben in WEZ +1. Es ist jetzt 13:04 Uhr.
Seite 1 von 2  1 2      

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