AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Win32/Win64 API (native code) Delphi Threads bleiben teilweise erhalten
Thema durchsuchen
Ansicht
Themen-Optionen

Threads bleiben teilweise erhalten

Ein Thema von Jackie1983 · begonnen am 28. Aug 2009 · letzter Beitrag vom 28. Aug 2009
Antwort Antwort
Jackie1983

Registriert seit: 12. Mär 2007
486 Beiträge
 
#1

Threads bleiben teilweise erhalten

  Alt 28. Aug 2009, 12:51
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.
  Mit Zitat antworten Zitat
HalloDu

Registriert seit: 24. Apr 2006
Ort: Oelde
267 Beiträge
 
Delphi 2009 Professional
 
#2

Re: Threads bleiben teilweise erhalten

  Alt 28. Aug 2009, 13:10
Hallo Jackie,

ist FreeOnTerminate auf True gesetzt?

MfG Freddy
Frederic H.
  Mit Zitat antworten Zitat
Benutzerbild von wicht
wicht

Registriert seit: 15. Jan 2006
Ort: Das schöne Enger nahe Bielefeld
809 Beiträge
 
Delphi XE Professional
 
#3

Re: Threads bleiben teilweise erhalten

  Alt 28. Aug 2009, 13:14
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..
http://streamwriter.org

"I make hits. Not the public. I tell the DJ’s what to play. Understand?"
  Mit Zitat antworten Zitat
HalloDu

Registriert seit: 24. Apr 2006
Ort: Oelde
267 Beiträge
 
Delphi 2009 Professional
 
#4

Re: Threads bleiben teilweise erhalten

  Alt 28. Aug 2009, 13:21
Ja, hat nichts damit zu tun. Habs gerade getestet.

@Jackie: Kannst du uns vielleicht noch etwas mehr Quellcode schicken, namentlich den von der Threadklasse.
Frederic H.
  Mit Zitat antworten Zitat
Jackie1983

Registriert seit: 12. Mär 2007
486 Beiträge
 
#5

Re: Threads bleiben teilweise erhalten

  Alt 28. Aug 2009, 15:18
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;
  Mit Zitat antworten Zitat
Benutzerbild von wicht
wicht

Registriert seit: 15. Jan 2006
Ort: Das schöne Enger nahe Bielefeld
809 Beiträge
 
Delphi XE Professional
 
#6

Re: Threads bleiben teilweise erhalten

  Alt 28. Aug 2009, 15:47
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?
http://streamwriter.org

"I make hits. Not the public. I tell the DJ’s what to play. Understand?"
  Mit Zitat antworten Zitat
Benutzerbild von rollstuhlfahrer
rollstuhlfahrer

Registriert seit: 1. Aug 2007
Ort: Ludwigshafen am Rhein
1.529 Beiträge
 
Delphi 7 Professional
 
#7

Re: Threads bleiben teilweise erhalten

  Alt 28. Aug 2009, 15:51
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
Bernhard
Iliacos intra muros peccatur et extra!
  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 11:41 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