![]() |
AW: Thread freigeben, wenn er festklebt :)
Bei Firebird geht das über die Monitoringtabellen (MON$STATEMENTS in diesem Fall)
|
AW: Thread freigeben, wenn er festklebt :)
Zitat:
|
AW: Thread freigeben, wenn er festklebt :)
Ist zwar schon nen bisl älter das Thema, aber ich hab auch genau den Fall,
und da hier auch nur nach den Auslösern fürs Hängen gesucht wurde, Frage ich nochmal :) Ich möchte einen Thread abschießen, der nicht mehr reagiert. Warum der hängt, soll egal sein ;) Z.b. es wrid im thread ne funktion aus einer DLL aufgerufen die dann in einer Schleife festhängt, und auf die DLL hat man keinen Einfluss. Die Wege fürs normale beenden sind mir bekannt, funktionieren aber nicht. Was ich bisher mache: 1.FreeOnTerminate setzen, in der Hoffnung das er sich irgendwann mal beendet, im Fehlerfall. 2.Thread Normal terminieren, im Timeout Fall /Fehler 3.Neuen Thread erstellen der die Aufgabe übernimmt :lol: Bei meiner Simulation, kommt beim beenden des Programmes der Destructor von dem Toten Thread NICHT zum tragen. Alternativ hab ich schon nachgedacht, den Programm Zustand zu merken und Programm neuzustarten :oops: Was mich interesstiert: -Möglichkeit den Thread zu killen, -TerminateThread( ![]() Mein ThreadTerminate das net geht:
Delphi-Quellcode:
FWorker.Terminate;
StartTimeout(tmpTO,'StopThread_tmpTO',3000); //das hier sollte man natürlcih net tun wenn FreeOnTerminate gesetzt ist... while not FWorker.Finished and not isTimeout(tmpTO) do begin Application.ProcessMessages; end; //FORCE KILL: if isTimeout(tmpTO) then begin System.SetLastError(ERROR_SUCCESS); iThreadExitCode:=0; if not GetExitCodeThread(FWorker.ThreadID,iThreadExitCode) then begin sMsg:=SysErrorMessage(GetLastError); //== 'Das Handle ist ungültig' , ist es aber nicht windows :P showmessage('Fehler1'); end; System.SetLastError(ERROR_SUCCESS); bOK:=TerminateThread(FWorker.ThreadID,iThreadExitCode); if bOK then showmessage('OK'); else begin showmessage('Fehler2') sMsg:=SysErrorMessage(GetLastError); //kein OS error vorhanden end; End; |
AW: Thread freigeben, wenn er festklebt :)
Wenn z.B. ein Socket gerade hängt, bekommst du den Thread nicht gekillt bevor das Timeout kommt.
An der Stelle wäre dann ein Multiprozessmodell wie in Google Chrome sinnvoll. Das wurde ja genau aus den Gründen eingeführt um hängende oder abgestürzte Tabs zu behandeln ohne dass der Browser selbst abstürzt. Das funktioniert in anderen Browsern ja bis heute nicht richtig. Einen solchen externen Prozess kannst du in fast allen Fällen abschießen. Es gibt allerdings auch dafür Grenzen. Manchmal kann man nicht einmal einen solchen Prozess abschießen. Diese Fälle sind aber selten. |
AW: Thread freigeben, wenn er festklebt :)
Zitat:
Delphi-Quellcode:
möchte aber ein Handle, nicht die ID.
GetExitCodeThread
|
AW: Thread freigeben, wenn er festklebt :)
In Fortsetzung der Ausfürungen des schönen Günther: Dasselbe trifft auf
![]() ![]() ![]() Grüße Dalai |
AW: Thread freigeben, wenn er festklebt :)
Es ist eben meist immer besser das Kind nicht erst in den Brunnen fallen zu lassen. Was sagt denn der Entwickler der DLL zu dem Problem?
|
AW: Thread freigeben, wenn er festklebt :)
Zitat:
Delphi-Quellcode:
, und der hat direkt schon die Eigenschaft
TThread
Delphi-Quellcode:
.
Handle
|
AW: Thread freigeben, wenn er festklebt :)
Delphi-Quellcode:
gibt ok zurück
GetExitCodeThread(FWorker.Handle,iThreadExitCode)
aber
Delphi-Quellcode:
Ich kann aber z.b. mit dem process Explorer von Sysinternals den toten Thread killen.
TerminateThread(FWorker.ThreadID,iThreadExitCode) = false
Dann muss es doch auch eine Interne Möglichkeit geben oder? |
AW: Thread freigeben, wenn er festklebt :)
Ich vermute einmal du musst wie Dalai geschrieben hat mit OpenThread arbeiten. Ich bezweifle, dass das Handle, das standardmäßig in der Eigenschaft Handle liegt, das Zugriffsrecht THREAD_TERMINATE hat. Siehe
![]() Dir muss aber klar sein, dass die Verwendung von TerminateThread das ganze System instabil machen oder zum Absturz bringen kann, wenn man nicht ganz genau weiß was man da tut. Deshalb ja auch die dringende Warnung in der Dokumentation: Zitat:
Sollte das eine Business Anwendung sein, wäre das schon ein NoGo für deren Einsatz in vielen Fällen. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 23:17 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz