Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   Delphi Threads bleiben teilweise erhalten (https://www.delphipraxis.net/139415-threads-bleiben-teilweise-erhalten.html)

Jackie1983 28. Aug 2009 11:51


Threads bleiben teilweise erhalten
 
Servus.

ich erstelle einen Thread.
Delphi-Quellcode:
var
  wmi : TWMIThread;
begin
  wmi := TWMIThread.Create(OnWMIData, 'Win32_OperatingSystem', '', '', '');
  wmi := TWMIThread.Create(OnWMIData, 'Win32_Printer', '', '', ''); //drucker
  //...
Irgend wann wenn der Thread die daten gelesen hat, ruft er die Methode OnWMIData auf.
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.

HalloDu 28. Aug 2009 12:10

Re: Threads bleiben teilweise erhalten
 
Hallo Jackie,

ist FreeOnTerminate auf True gesetzt?

MfG Freddy

wicht 28. Aug 2009 12:14

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..

HalloDu 28. Aug 2009 12:21

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.

Jackie1983 28. Aug 2009 14:18

Re: Threads bleiben teilweise erhalten
 
Einmal die Create Methode
Delphi-Quellcode:
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;
Die Execute Methode
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;

wicht 28. Aug 2009 14:47

Re: Threads bleiben teilweise erhalten
 
Delphi-Quellcode:
  if Assigned(fOnWMIData) then
    fOnWMIData(wmi);
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?

rollstuhlfahrer 28. Aug 2009 14:51

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