AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Sprachen und Entwicklungsumgebungen Sonstige Fragen zu Delphi Delphi Threads beenden, die ich nicht erzeugt habe
Thema durchsuchen
Ansicht
Themen-Optionen

Threads beenden, die ich nicht erzeugt habe

Ein Thema von Sherlock · begonnen am 30. Jul 2007 · letzter Beitrag vom 30. Jul 2007
Antwort Antwort
Benutzerbild von Sherlock
Sherlock

Registriert seit: 10. Jan 2006
Ort: Offenbach
3.798 Beiträge
 
Delphi 12 Athens
 
#1

Threads beenden, die ich nicht erzeugt habe

  Alt 30. Jul 2007, 13:00
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
Oliver
  Mit Zitat antworten Zitat
Benutzerbild von Sherlock
Sherlock

Registriert seit: 10. Jan 2006
Ort: Offenbach
3.798 Beiträge
 
Delphi 12 Athens
 
#2

Re: Threads beenden, die ich nicht erzeugt habe

  Alt 30. Jul 2007, 14:47
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
Oliver
  Mit Zitat antworten Zitat
gabneo

Registriert seit: 15. Okt 2006
Ort: Deutsche Toskana :)
93 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#3

Re: Threads beenden, die ich nicht erzeugt habe

  Alt 30. Jul 2007, 14:58
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.

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.
  Mit Zitat antworten Zitat
Benutzerbild von Sherlock
Sherlock

Registriert seit: 10. Jan 2006
Ort: Offenbach
3.798 Beiträge
 
Delphi 12 Athens
 
#4

Re: Threads beenden, die ich nicht erzeugt habe

  Alt 30. Jul 2007, 15:14
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
Oliver
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 07:03 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