Hallo Leute,
ich habe in einem älteren Programm einen (für mich) seltsamen Fehler. Nach ca. einem halben Tag Laufzeit kommt es zu einem Thread-Fehler. Der Callstack führt mich zu einem TThread.Create. Es handelt sich bei diesem Thread, der in regelmäßigen Abständen eine Referenzliste aus einer Datenbank abruft um diese aktuell zu halten. Von diesen Threads gibt es mehrere, weil teilweise unterschiedliche Intervalle notwendig sind. Der Thread wird bis zum Mittag einige hundert mal aufgerufen und läuft fehlerfrei durch.
Vor dem Start des Threads wird geprüft ob er aus irgendeinem Grund noch läuft und wird beendet.
Beendet wird er so:
Delphi-Quellcode:
proceudre Tfrm_main.KillThreadUrlaubsGrund;
var
ThreadHandle: THandle;
begin
if ThLoadUrlaubsGrund<>nil then
begin
ThreadHandle:=ThLoadUrlaubsGrund.Handle;
ThLoadUrlaubsGrund.OnFinished:=nil;
ThLoadUrlaubsGrund.OnNewUrlaubsgrundList:=nil;
ThLoadUrlaubsGrund.Terminate;
WaitForSingleObject(ThreadHandle, 500);
ThLoadUrlaubsGrund:=nil;
end;
end;
Gestarte wird er so:
Delphi-Quellcode:
KillThreadUrlaubsGrund;
ThLoadUrlaubsGrund:=TThreadLoadUrlaubsgrundList.Create(True, dm1.Con);
HandleUrlaubsgrundListThread:=ThLoadUrlaubsGrund.Handle;
ThLoadUrlaubsGrund.OnFinished:=OnFinishUrlaubsGrundThread;
ThLoadUrlaubsGrund.OnNewUrlaubsgrundList:=OnUpdateUrlaubsGrundList;
WritePrivateLog('Start Thread UrlaubsGrund ('+IntToStr(HandleUrlaubsgrundListThread)+')');
ThLoadUrlaubsGrund.Resume;
Der Fehler tritt dann im Create des TThreadLoadUrlabusgrundList auf:
Delphi-Quellcode:
constructor TThreadLoadUrlaubsgrundList.Create(Suspended: Boolean;
Con: TZConnection);
begin
inherited Create(Suspended); //<--------- Hier zeigt Callstack den Fehler Thread-Fehler: (6)
FDBHost:=Con.HostName;
FDBPort:=Con.Port;
FDBUser:=Con.User;
FDBPass:=Con.Password;
FDBDatabase:=Con.Database;
FDBProtocol:=Con.Protocol;
self.FreeOnTerminate:=True;
end;
Beende ich den Thread falsch? Der Thread läuft mit FreeOnTerminate=True.
Als letzte Zeile im Execute des Thread rufe ich noch einen Event auf, der im Aufrufthread die Variable des Thread auf nil setzt. Sollte also der Thread, aus welchem Grund auch immer, länger brauchen als der Aufrufintervall definiert ist, soll er über die Methode KillThreadUrlaubsGrund gekillt werden.
Vielleicht steh ich ja auf dem Schlauch, und mache irgendwas grundlegend falsch.