![]() |
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 |
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 |
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 ![]() 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 ![]() Edit2: Ich hab hier noch ein bißchen Sourcecode ausgegraben, der dir anzeigt wieviele Threads du gerade noch laufen hast.
Delphi-Quellcode:
Und dann gibt es hier in der Delphi-Praxis einige Diskussions-Threads über das entleeren von Speicherbereichen einfach suchen.
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; |
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