AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

hungapp nach relativ kurzer Zeit

Ein Thema von zeras · begonnen am 8. Apr 2009 · letzter Beitrag vom 11. Apr 2009
Antwort Antwort
Seite 1 von 2  1 2      
zeras

Registriert seit: 11. Mär 2007
Ort: Saalkreis
1.618 Beiträge
 
Delphi 12 Athens
 
#1

hungapp nach relativ kurzer Zeit

  Alt 8. Apr 2009, 22:25
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.
Matthias
  Mit Zitat antworten Zitat
Benutzerbild von jaenicke
jaenicke

Registriert seit: 10. Jun 2003
Ort: Berlin
9.332 Beiträge
 
Delphi 11 Alexandria
 
#2

Re: hungapp nach relativ kurzer Zeit

  Alt 8. Apr 2009, 22:48
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?
Sebastian Jänicke
Alle eigenen Projekte sind eingestellt, ebenso meine Homepage, Downloadlinks usw. im Forum bleiben aktiv!
  Mit Zitat antworten Zitat
zeras

Registriert seit: 11. Mär 2007
Ort: Saalkreis
1.618 Beiträge
 
Delphi 12 Athens
 
#3

Re: hungapp nach relativ kurzer Zeit

  Alt 9. Apr 2009, 06:25
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:

   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?

   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?
Matthias
  Mit Zitat antworten Zitat
alzaimar
(Moderator)

Registriert seit: 6. Mai 2005
Ort: Berlin
4.956 Beiträge
 
Delphi 2007 Enterprise
 
#4

Re: hungapp nach relativ kurzer Zeit

  Alt 9. Apr 2009, 07:04
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;
"Wenn ist das Nunstruck git und Slotermeyer? Ja! Beiherhund das Oder die Flipperwaldt gersput!"
(Monty Python "Joke Warefare")
  Mit Zitat antworten Zitat
Sven M.

Registriert seit: 21. Okt 2006
Ort: Halle/Saale
106 Beiträge
 
Delphi 5 Enterprise
 
#5

Re: hungapp nach relativ kurzer Zeit

  Alt 9. Apr 2009, 07:20
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:

   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?

   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.
  Mit Zitat antworten Zitat
zeras

Registriert seit: 11. Mär 2007
Ort: Saalkreis
1.618 Beiträge
 
Delphi 12 Athens
 
#6

Re: hungapp nach relativ kurzer Zeit

  Alt 9. Apr 2009, 08:55
@ 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.
Matthias
  Mit Zitat antworten Zitat
Benutzerbild von jaenicke
jaenicke

Registriert seit: 10. Jun 2003
Ort: Berlin
9.332 Beiträge
 
Delphi 11 Alexandria
 
#7

Re: hungapp nach relativ kurzer Zeit

  Alt 9. Apr 2009, 13:49
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 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.
Sebastian Jänicke
Alle eigenen Projekte sind eingestellt, ebenso meine Homepage, Downloadlinks usw. im Forum bleiben aktiv!
  Mit Zitat antworten Zitat
zeras

Registriert seit: 11. Mär 2007
Ort: Saalkreis
1.618 Beiträge
 
Delphi 12 Athens
 
#8

Re: hungapp nach relativ kurzer Zeit

  Alt 9. Apr 2009, 14:10
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.
Matthias
  Mit Zitat antworten Zitat
Benutzerbild von jaenicke
jaenicke

Registriert seit: 10. Jun 2003
Ort: Berlin
9.332 Beiträge
 
Delphi 11 Alexandria
 
#9

Re: hungapp nach relativ kurzer Zeit

  Alt 9. Apr 2009, 14:25
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.
Sebastian Jänicke
Alle eigenen Projekte sind eingestellt, ebenso meine Homepage, Downloadlinks usw. im Forum bleiben aktiv!
  Mit Zitat antworten Zitat
zeras

Registriert seit: 11. Mär 2007
Ort: Saalkreis
1.618 Beiträge
 
Delphi 12 Athens
 
#10

Re: hungapp nach relativ kurzer Zeit

  Alt 9. Apr 2009, 14:30
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).
Matthias
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


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 09:12 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