Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Threads beenden, die ich nicht erzeugt habe (https://www.delphipraxis.net/96746-threads-beenden-die-ich-nicht-erzeugt-habe.html)

Sherlock 30. Jul 2007 12:00


Threads beenden, die ich nicht erzeugt habe
 
Hallo,

wiedermal was seltsames :)

Ich habe ein OCX geschrieben, daß einige Units/Komponenten verwendet, die eigene Threads aufmachen. Zum beispiel Timer, DB-Zugriffe etc. Sobald das OCX beendet wird, bleibt mindestens einer der Threads hängen und das aufrufende Programm kann nicht ordnungsgemäß beendet werden. Im Destructor des OCX hab ich alle mir bekannten benutzten Objekte freigegeben, allerdings bleibt die Kiste immer noch hängen.

Im Debugger sehe ich auch die Thread, allerdings ohne nähere Bezeichnung. Meine Frage ist nun, wie kann ich die Threads auflisten, die meine App generiert, und wie kann ich die dann beenden/abschießen?

Danke,
Sherlock

Sherlock 30. Jul 2007 13:47

Re: Threads beenden, die ich nicht erzeugt habe
 
OK, es gibt da wohl die Toolhelp API...gekapselt in TlHelp32.pas. Damit kann man sich Prozesse und Threads auflisten lassen. Muss mich noch durchwühlen, aber das scheint es zu ein, wobei die Struktur wohl detaillierte Infos zu Prozessen nicht aber zu Threads gibt. Also nur die Anzahl Threads...hmmmmm

Sherlock

gabneo 30. Jul 2007 13:58

Re: Threads beenden, die ich nicht erzeugt habe
 
Hi,
ich hatte mal ein ähnliches Problem und kann dafür ProcessXP nur empfehlen. Den "nachfolger" von Microsoft habe ich mir nur kurz angeschaut, wird dir nichts bringen.
Ziehe dir diese Version hier.
Per Rechtsklick auf den Prozess und über die Properties kommst du dann zu dem Reiter "Threads" da steht immerhin schon deren Stack-Addresse drinnen. guck dir das Teil genau an...damit kann man sehr viel machen. :thumb:

greez
gabneo

Edit:
Der Microsoft-link funktioniert nicht: klickst du hier!

Edit2:
Ich hab hier noch ein bißchen Sourcecode ausgegraben, der dir anzeigt wieviele Threads du gerade noch laufen hast.
Delphi-Quellcode:
uses TlHelp32

function Findthread:integer;
var procid:dword; SHandle:THandle; Continue:boolean; ProcEntry:Pr ocessEntry32; i:integer;
begin
i:=0;
GetWindowThreadProcessID(application.Handle,@procid);
shandle:=CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,procid);
ProcEntry.dwSize:=Sizeof(ProcEntry);
  Continue:=Process32First(SHandle, ProcEntry);
  while Continue do
   begin
    if ProcEntry.th32ProcessID=ProcID then i:=procentry.cntThreads;
    Continue:=Process32Next(SHandle, ProcEntry);
  end;
  CloseHandle(SHandle);
  result:=i;
end;
Und dann gibt es hier in der Delphi-Praxis einige Diskussions-Threads über das entleeren von Speicherbereichen einfach suchen.

Sherlock 30. Jul 2007 14:14

Re: Threads beenden, die ich nicht erzeugt habe
 
Hajo, das ist schon ein schönes Tool. Nur weiss ich nicht, ob es mir hilft, die Threads zum Programmlauf zu beenden. :(
Denn das brauch ich ja. Die 3rd Party Components im meinem OCX scheinen einen Thread hängen zu lassen, den ich im Destroy explizit beenden möchte. Aber vielleicht finde ich mit dem Tool wenigstens den Missetäter heraus.

Den Code schau ich mir mal an, Danke :)


Edit: Sodele mit dem Code komm ich nicht ganz zurecht, da ich ja leider mit einem OCX hantiere. Dessen Application ist dann der aufrufende Container, also forsch ich da noch, wie ich auf einen Handle des OCX komme.

Danke,
Sherlock


Alle Zeitangaben in WEZ +1. Es ist jetzt 02:30 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