![]() |
TCriticalSection Frage
Hiho!
Habe ein kleines Programm, welches ausnahmsweise mal Threads nutzen soll (brauche ich normalerweise nicht). Jetzt habe ich meinen Thread eingebaut der die komplette Verarbeitung übernimmt und alles an Daten in sich selbst speichert. Hat eigentlich nur den Sinn, dass das Hauptfenster nicht regelmäßig bei der Verarbeitung einfriert. Einzige Zugriffe auf das Hauptfenster sind lesend auf die graphischen Komponenten (TDateTimePicker.Date z.B.) und auf die <writeStatus>-Funktion des selbigen. Diese Funktion schreibt halt einen Text in den Statusbereich des Fensters und sieht so aus:
Delphi-Quellcode:
An sich funzt das auch einwandfrei, also das Programm/der Thread rattert durch und die Nachrichten werden regulär angezeigt.
// writes the given message to the status-label & log-file
procedure TfrmMain.writeStatus(); begin csGui.Enter(); try // write message to the status-label ... lblStatus.Caption := logMsg; lblStatus.Update(); Application.ProcessMessages(); // ... & log-file if logFile <> nil then begin logMsg := logMsg + #13#10; logFile.Write(PChar(logMsg)^, Length(logMsg) ); end; except on e: Exception do begin logMsg := 'Fehler in Funktion <TfrmMain.writeStatus>: ' + e.Message; ShowMessage(logMsg); end; end; csGui.Leave(); end; Wenn ich das Hauptfenster dann jetzt aber schließen möchte, erhalte ich die Fehlermeldung: "Die Ausnahme Unbekannter Softwarefehler (0x...) ist an der Anwendung an Stelle 0x... aufgetreten" und anschließend "Exception EOSError in Modul Programmname.exe bei 000.... Systemfehler Code 1400: Ungültiges Fensterhandle" ... Diese Fehlermeldung hatte ich vor Einbindung des Threads und der Critical Sections nicht. Da ich sämtliche Funktionen die ich nutze mit einem try-except Block versehen habe, kann ich also ausschließen, dass es sich in einer "meiner" Funktionen abspielt und nach Form.Close passiert. Nur habe ich leider absolut keine Ahnung, was denn jetzt nich funktionieren sollte, denn alles funktioniert während des Programmes selbst einwandfrei, nur wenn ich es schließe knallt es... Wurde der Thread nicht gestartet, erscheint diese Fehlermeldung ebenfalls nicht. Kann es vielleicht sein, dass meine "ungeschützten" Lesezugriffe auf den DateTimePicker z.B. was damit zu tun haben? Hat wer ne Idee? Danke im Voraus cu Patrick |
Re: TCriticalSection Frage
Wozu brauchst du das Application.Processmessages? Ich denke du hast einen Thread.
Und ich bin der Meinung, die GUI kannst du nicht in eine CS packen. Wie verhinderst du denn auf der anderen Seite, dass das Label grad neu gezeichnet wird? btw.: Zitat:
|
Re: TCriticalSection Frage
Zitat:
... b) Geht mir ja viel mehr darum, dass diese Funktion nich zufällig mal vom Hauptfenster UND dem Thread gleichzeitig aufgerufen wird. Das müsste ich mit einer CS doch so realisieren können, oder? ... c) Also ich brauche das im Regelfall nich, da ich hauptsächlich Batchprogramme im weitesten Sinne betreibe. Programmstart -> evt. Benutzereingaben -> Liest Daten -> Stellt was damit an -> Liste/PDF/Druck/DB/WasAuchImmer kommt raus -> Ende. Einziger Vorteil von Threads wäre hier die Laufzeit, aber da die DB-Schnittstelle die ich benutzen muss eh nicht Threadtauglich ist, hat sich das Thema so oder so erledigt. *G* |
Re: TCriticalSection Frage
zu b) Ja, das kannst du so verhindern. Allerdings bleibt dann immer noch das Problem, dass die GUI ja auch selbstständig etwas macht (z.B. sich neu zeichnet). Dann hast du ein Problem, welches du hier nicht abfängst.
c) Warum soll eine DB-Schnittstelle Threadsicher sein. Ich lege die DB-Komponenten prinzipiell immer komplett in einen Thread. |
Re: TCriticalSection Frage
Es sollte halt in jedem Thread eine eigene Verbindung zur datenbank aufgebaut werden, wenn diese das unterstützt
|
Re: TCriticalSection Frage
Zitat:
Habe neben der Statusbar auch noch ein TAnimate gehabt, und sobald ich das entferne, erscheint der Fehler nicht mehr. Vermute mal, dass sich das TAnimate selbst und gleichzeitig der Thread die StatusBar neu gezeichnet hat und das dadurch irgendwas kaputt gegangen ist, z.B. Gibts da irgendwie ne Möglichkeit, wie ich das lösen kann? *grübel* ... c) Ne so mein ich das nicht. Der DB-Hersteller sagt selbst, es geht nur 1 aktive Verbindung je Prozess. D.h. ich muss wenn ich 2 Verbindungen machen will auch explizit 2 komplett getrennte Prozesse/Programme haben und 2 Threads tun es da also nich mehr. Hatte ich sogar mal erfolgreich programmiert indem ich quasi nen Client/Server im weitesten Sinne gemacht hatte. Also 1 Master der 2 Unterprogramme aufruft und diese "koordiniert", während diese autonom verarbeiten. Nur muss ich sagen war der Programmieraufwand gemessen am Nutzen irgendwie nich soooo berauschend gewesen, deswegen lasse ich das mittlerweile. :D |
Re: TCriticalSection Frage
Zitat:
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 02:49 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 by Thomas Breitkreuz