Einzelnen Beitrag anzeigen

Benutzerbild von Captnemo
Captnemo

Registriert seit: 27. Jan 2003
Ort: Bodenwerder
1.126 Beiträge
 
Delphi XE4 Architect
 
#13

AW: Absturz der Anwendung nach beenden eines Threads

  Alt 19. Jun 2014, 15:34
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;
Dieter
9 von 10 Stimmen in meinem Kopf sagen ich bin nicht verrückt. Die 10. summt dazu die Melodie von Supermario Bros.
MfG Captnemo
  Mit Zitat antworten Zitat