Also ich habe mir jetzt im Thread im OnTerminate per PostMessage eine Message an den Hauptthread schicken lassen.
Dann rufe ich folgende Procedure auf
Delphi-Quellcode:
Writelog('
Message TCPComThreadEnded empfangen');
for I := ComThreadList.Count-1
downto 0
do
begin
if TTCPThread(ComThreadList[i]).Finished
then
begin
Writelog('
FreeAnNil TCPComThread');
TTCPThread(ComThreadList[i]).Free;
Writelog('
Thread aus TObjectList entfernen');
ComThreadList.Delete(i);
//<- Hier tritt eine Exception auf, dass das Object nicht mehr da ist.
end;
end;
Erzeugen tu ich es so:
Delphi-Quellcode:
TCPThread:=TTCPThread.Create(False, '
192.168.177.71', localport,
ip, port, self.Handle);
ComThreadList.Add(TCPThread);
Muß ich es auf der ComThreadList nicht mehr löschen?
Wenn ich bei ComThreadList.Delete(i) eine Haltepunkt setze, und alle im Einzelschritt durchgehe, dann lande ich in der
Unit "System.Classes" in der Funktion "TThread.destroy".
Das kommt aber wahrscheinlich durch den Aufruf von .Free (2 Zeilen drüber).
Und ich lande hier:
Delphi-Quellcode:
destructor TThread.Destroy;
begin
if (FThreadID <> 0)
and not FFinished
and not FExternalThread
then
begin
Terminate;
if FCreateSuspended
or FSuspended
then
Resume;
WaitFor;
end;
RemoveQueuedEvents(Self);
{$IF Defined(MSWINDOWS)}
if (FHandle <> 0)
and not FExternalThread
then CloseHandle(FHandle);
//<- Hier habe ich eine Exception:
// Im Project WSPRG.exe ist eine Exception der Klasse $C00000005 mit der
// Meldung 'Zugriffsverletzung bei 0x00000000: Lesen von Adresse 0x00000000' aufgetreten
{$ELSEIF Defined(POSIX)}
// This final check is to ensure that even if the thread was never waited on
// its resources will be freed.
if (FThreadID <> 0)
and not FExternalThread
then pthread_detach(pthread_t(FThreadID));
{$IF Defined(MACOS)}
pthread_mutex_destroy(FCreateSuspendedMutex);
{$ELSEIF Defined(LINUX)}
sem_destroy(FCreateSuspendedSem);
{$ENDIF LINUX}
{$ENDIF POSIX}
inherited Destroy;
FFatalException.Free;
end;