Thema: Delphi TCriticalSection Frage

Einzelnen Beitrag anzeigen

Errraddicator

Registriert seit: 26. Jun 2008
161 Beiträge
 
Delphi 2007 Professional
 
#1

TCriticalSection Frage

  Alt 5. Jun 2009, 11:13
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:
// 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;
An sich funzt das auch einwandfrei, also das Programm/der Thread rattert durch und die Nachrichten werden regulär angezeigt.

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