Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Thread von "aussen" abbrechen (https://www.delphipraxis.net/148350-thread-von-aussen-abbrechen.html)

DelTurbo 28. Feb 2010 10:45


Thread von "aussen" abbrechen
 
Hi,

mein programm lief nun ca. 5 tage durch. Leider blieben in der zeit 2 Threads "stehen". Es wurden in dieser zeit ca. 2.500 thread erzeugt und beendet. Maximal liefen 73 auf einmal. Ich habe keine ahnung wo die sich die 2 rumtreiben. Es ist leider auch sehr schwer nachzuvollziehen. Mir fällt leider überhauptnix ein wie ich das reproduzieren könnte.

So, nun zur frage. Kann ich die Threads irgendwie von aussen abbrechen bzw. killen? Ich erzeuge die threads wie mir hier geraten wurde wie folgt.

Delphi-Quellcode:
Thread[i].ThreadHandle:=BeginThread(nil, 0, @Chan,@Thread[i].MyID, 0, Thread[i].ThreadID);
if Thread[i].ThreadHandle<>0 then CloseHandle(Thread[i].ThreadHandle);
Kann ich danach überhaupt nochwas mit dem Handle anfangen? bzw. ihn darüber abbrechen? Wenn ja wäre es ja einfach dort eine art Watchdog zu bauen.

Vielen dank im voraus

Neutral General 28. Feb 2010 10:53

Re: Thread von "aussen" abbrechen
 
Hi schau mal MSDN-Library durchsuchenTerminateThread

DelTurbo 28. Feb 2010 11:34

Re: Thread von "aussen" abbrechen
 
Ist denn das ThreadHandle überhaupt noch gültig?

Neutral General 28. Feb 2010 11:44

Re: Thread von "aussen" abbrechen
 
Wenn du zuerst den Thread terminierst und dann das Handle schließt schon :-P

DelTurbo 28. Feb 2010 11:50

Re: Thread von "aussen" abbrechen
 
Also von dem beispiel wie es oben steht, ist das handle wohl nichtmehr gültig. Richtig? Wie komme ich sonstnoch an den Thread ran?

Neutral General 28. Feb 2010 11:54

Re: Thread von "aussen" abbrechen
 
:roll:

Delphi-Quellcode:
Thread[i].ThreadHandle:=BeginThread(nil, 0, @Chan,@Thread[i].MyID, 0, Thread[i].ThreadID);

if Thread[i].ThreadHandle<>0 then
begin
  TerminateThread(Thread[i].ThreadHandle,0);
  CloseHandle(Thread[i].ThreadHandle);
end;

DelTurbo 28. Feb 2010 12:05

Re: Thread von "aussen" abbrechen
 
Erstmal danke für deine hilfe. Also müsste ich das Close oben raushohlen. Die frage ist nun, darf der Thread selber, wenn er fertig ist, das Close ausführen oder scheppert das?

Fridolin Walther 28. Feb 2010 19:10

Re: Thread von "aussen" abbrechen
 
Genau genommen brauchst Du das Handle gar nicht, wenn Du die ThreadID hast und kannst es also prinzipiell direkt nach Threaderstellung schließen. Wenn Du dann wirklich einen Thread killen willst, holst Du Dir mit OpenThread einfach ein neues Handle zum Terminieren. Die Gefahr Handles zu leaken ist dabei viel geringer.

Generell wäre der bessere Weg aber die Ursache zu finden, wieso Threads "stehen bleiben".

DelTurbo 1. Mär 2010 12:52

Re: Thread von "aussen" abbrechen
 
Zitat:

Zitat von Fridolin Walther
Generell wäre der bessere Weg aber die Ursache zu finden, wieso Threads "stehen bleiben".

Leider ist das genau mein prob. Ich weiss es nicht. Das problem ist halt das es erst nach tagen auftritt. Ich habe auch madcollection mitlaufen. Der meldet leider auchnix.

Das mit dem OpenThread werde ich mir nachher mal ansehen. Wenn ich dazu noch fragen haben sollte, poste ich einfach :zwinker:

Danke

BUG 1. Mär 2010 13:05

Re: Thread von "aussen" abbrechen
 
Excepton in Thread auslösen ist vielleicht auch für dich interessant.

Astat 1. Mär 2010 18:48

Re: Thread von "aussen" abbrechen
 
Zitat:

Zitat von DelTurbo
Zitat:

Zitat von Fridolin Walther
Generell wäre der bessere Weg aber die Ursache zu finden, wieso Threads "stehen bleiben".


Hallo DelTurbo, wie @Fridolin Walther schon schrieb, wird der Sündenbock im Execute liegen.
Zeig doch mal den Source, und Abhängigkeiten von Globalen Variablen (Objektvariablen nicht vergessen).

lg. Astat

DelTurbo 2. Mär 2010 10:17

Re: Thread von "aussen" abbrechen
 
Hi,

hat sich erledigt. Ich habe den übeltäter gestern durch reinen zufall gefunden. Beim IdFTP.Disconnect passiert das. Da wurde einfach ein "quit" an den server geschickt. Egal in welchem "zustand" der server war. Der effekt war dann, das der Thread einfach komplett verlassen wurde. Obwohl ich das Disconnect mit try und except abfange, ist er da nichtmehr wiedergekommen. Einfach ein try an die stelle (siehe unten) rein und gut war.

Das problem war halt, das es so selten auftritt. Aber es gibt halt sachen die nicht sauber abgefangen werden. Ob es nochmehr gibt weiss ich nicht. Das es am IdFTP liegt hatte ich schon beim erstenmal in verdacht. Aber nicht richtig gesucht.

Der vollständigkeitshalber hier die stelle im IdFTP.pas.

Delphi-Quellcode:
procedure TIdFTP.DisconnectNotifyPeer;
begin
  if IOHandler.Connected then begin
    IOHandler.WriteLn('QUIT');     {do not localize} <-- hier tritt dann der fehler auf.
    IOHandler.CheckForDataOnSource(100);
    if not IOHandler.InputBufferIsEmpty then begin
      GetInternalResponse;
    end;
  end;
end;
Vielen dank an alle die geholfen haben.....

QuickAndDirty 2. Mär 2010 11:58

Re: Thread von "aussen" abbrechen
 
Dennoch ist ein Watchdog für Systeme die immer hochverfügbar sein müssen nicht schlecht. Denn jeder macht mal Fehler!

DelTurbo 2. Mär 2010 12:03

Re: Thread von "aussen" abbrechen
 
Zitat:

Zitat von QuickAndDirty
Dennoch ist ein Watchdog für Systeme die immer hochverfügbar sein müssen nicht schlecht. Denn jeder macht mal Fehler!

Das ist vollkommen richtig. Zumal das teil einfach auf nem rechner läuft wo nur ein Strom und ein Netzwerkabel reingeht. Kein Monitor, keine Maus... usw.

Die Watchdog kommt trotzdem rein. Hatte ich auch geschrieben, aber ist beim editieren verloren gegangen :oops:

DelTurbo 23. Mai 2010 12:21

Re: Thread von "aussen" abbrechen
 
Liste der Anhänge anzeigen (Anzahl: 1)
Nachtrag:

Besser spät als nie. Angehängt ist ein testprogram wo man(n) wie es geht.

Gruss

Luckie 23. Mai 2010 12:32

Re: Thread von "aussen" abbrechen
 
Man beendet keine Threads von außen, sondern man signalisiert ihnen nur von außen, dass sie sich beenden sollen. Wenn du einen Thread von außen beendest, also abschießt, dann kann es passieren, dass die vom Thread belegten Ressourcen in einem inkonsistenten Zustand sind; was natürlich auch folgen für andere Threads haben kann, welche diese Ressourcen nutzen. Also signalisiere dem Thread, dass er sich beenden soll und der Thread kann sich dann kontrolliert selber beenden.


Alle Zeitangaben in WEZ +1. Es ist jetzt 14:15 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz