Threads bleiben teilweise erhalten
Servus.
ich erstelle einen Thread.
Delphi-Quellcode:
Irgend wann wenn der Thread die daten gelesen hat, ruft er die Methode OnWMIData auf.
var
wmi : TWMIThread; begin wmi := TWMIThread.Create(OnWMIData, 'Win32_OperatingSystem', '', '', ''); wmi := TWMIThread.Create(OnWMIData, 'Win32_Printer', '', '', ''); //drucker //... So weit so gut. Wenn ich mein Programm im Taskmanager beobachte dann steht vor dem Thread aufruf. 5 Threads. Nach dem Aufruf 9 Threads. Normal müste doch wenn der Thread beendet wurde wieder die 5 Threads stehen, ist aber nicht. Da ich nicht weis wann die Threads fertig sind, rufe ich auch kein Free oder Terminate auf. Und die Execute Methode müste überall komplett durchlaufen. |
Re: Threads bleiben teilweise erhalten
Hallo Jackie,
ist FreeOnTerminate auf True gesetzt? MfG Freddy |
Re: Threads bleiben teilweise erhalten
Sicher, dass es mit FreeOnTerminate zu tun hat? Ich würde vermuten, dass der Thread weg ist, wenn Execute() durchgelaufen ist. Sorry, ist keine Antwort auf die Frage..
|
Re: Threads bleiben teilweise erhalten
Ja, hat nichts damit zu tun. Habs gerade getestet.
@Jackie: Kannst du uns vielleicht noch etwas mehr Quellcode schicken, namentlich den von der Threadklasse. |
Re: Threads bleiben teilweise erhalten
Einmal die Create Methode
Delphi-Quellcode:
Die Execute Methode
constructor TWMIThread.Create(OnWMIData: TOnWMIData; WMIClass: string;WMIHost,WMIUser,WMIPass : string);
begin inherited Create(False); fOnWMIData := OnWMIData; fWMIClass := WMIClass; fWMIHost := WMIHost; fWMIUser := WMIUser; fWMIPass := WMIPass; fWhere := ''; FreeOnTerminate := true; end;
Delphi-Quellcode:
procedure TWMIThread.Execute;
var wmi : TWMI; i : integer; begin inherited; CoInitialize(nil); wmi := LoadClassInData(fWMIClass, fWMIHost, fWMIUser, fWMIPass); wmi.WMIClass := fWMIClass; if Assigned(fOnWMIData) then fOnWMIData(wmi); for i:=0 to wmi.InstanceCount-1 do wmi.Instance[i].Free; OleUninitialize; end; |
Re: Threads bleiben teilweise erhalten
Delphi-Quellcode:
Was passiert in der damit verbundenen Funktion? Ich schätze mal, dass die Form dem Thread eine Methode mitgibt, die dann ausgeführt wird? Eventuell Synchronize() vergessen oder sowas?
if Assigned(fOnWMIData) then
fOnWMIData(wmi); |
Re: Threads bleiben teilweise erhalten
Mal ne doofe Frage: du rufst in deiner .Execute() Methode CoInitialize auf. Und am Ende verwendest du OleUninitialize. Müsste das eigentlich nicht entweder am anfang OleInitialize oder dann am Ende CoUnInilialize heißen??
Bernhard |
Alle Zeitangaben in WEZ +1. Es ist jetzt 07:54 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