![]() |
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. |
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? |
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:
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?
fMain.MeLog.Lines.Add(s);
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? |
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; |
Re: hungapp nach relativ kurzer Zeit
Zitat:
Threads lohnen sich daher (fast) nur bei wirklich aufwendigen, zeit- und rechenintensiven Prozessen. |
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:
Darf ich sowas auch nicht im Thread nutzen?function GetManu(fname:string):string; var T : TStringList; begin result:=''; T:=TStringList.create; try T.LoadFromFile(sRenamed); //do something finally T.Free; end; end; @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. |
Re: hungapp nach relativ kurzer Zeit
Zitat:
Zitat:
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. |
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. |
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. |
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 16:53 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz