Autor Beitrag
Bergmann89
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 1742
Erhaltene Danke: 72

Win7 x64, Ubuntu 11.10
Delphi 7 Personal, Lazarus/FPC 2.2.4, C, C++, C# (Visual Studio 2010), PHP, Java (Netbeans, Eclipse)
BeitragVerfasst: Sa 08.12.12 15:47 
Hey Leute,

ich hab heute festgestellt, das meine Anwendung viele Threads ohne Aufgabe hat. Also bin ich dem mal auf den Grund gegangen und hab festgestellt, das ein SWbemService erstellt wird. Dieser erstellt 5 neue Threads, die aber nicht wieder freigegeben werden. Wie genau mach ich das? Ich will nicht, das die Thread die ganze Zeit sinnlos im Hintergrund rumliegen. Hier mal die Prozedur, in der ich den SWbemService nutze.

ausblenden volle Höhe Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
procedure GetWin32_ProcessorInfo;
const
  WbemUser            ='';
  WbemPassword        ='';
  WbemComputer        ='localhost';
  wbemFlagForwardOnly = $00000020;
var
  FSWbemLocator : OLEVariant;
  FWMIService   : OLEVariant;
  FWbemObjectSet: OLEVariant;
  FWbemObject   : Variant;
  oEnum         : IEnumvariant;
  i: Integer;
begin;
  try try
    FSWbemLocator := CreateOleObject('WbemScripting.SWbemLocator');
    FWMIService   := FSWbemLocator.ConnectServer(WbemComputer, 'root\CIMV2', WbemUser, WbemPassword);
    FWbemObjectSet:= FWMIService.ExecQuery('SELECT * FROM Win32_Processor','WQL',wbemFlagForwardOnly);
    oEnum         := IUnknown(FWbemObjectSet._NewEnum) as IEnumVariant;
    i := 0;
    while oEnum.Next(1, FWbemObject, nil) = 0 do begin
      inc(i);
      LogMsg('  Processor '+IntToStr(i)+' Information:');

      WriteVariant('    AddressWidth: '#9#9#9,          FWbemObject.Properties_.Item('AddressWidth').Value);
      WriteVariant('    Caption: '#9#9#9#9,             FWbemObject.Properties_.Item('Caption').Value);
      WriteVariant('    CurrentClockSpeed: '#9#9,       FWbemObject.Properties_.Item('CurrentClockSpeed').Value);
      WriteVariant('    Description: '#9#9#9,           FWbemObject.Properties_.Item('Description').Value);
      WriteVariant('    ExtClock: '#9#9#9,              FWbemObject.Properties_.Item('ExtClock').Value);
      WriteVariant('    Family: '#9#9#9#9,              FWbemObject.Properties_.Item('Family').Value);
      WriteVariant('    Manufacturer: '#9#9#9,          FWbemObject.Properties_.Item('Manufacturer').Value);
      WriteVariant('    MaxClockSpeed: '#9#9#9,         FWbemObject.Properties_.Item('MaxClockSpeed').Value);
      WriteVariant('    Name: '#9#9#9#9,                FWbemObject.Properties_.Item('Name').Value);
      WriteVariant('    NumberOfCores: '#9#9#9,         FWbemObject.Properties_.Item('NumberOfCores').Value);
      WriteVariant('    NumberOfLogicalProcessors: '#9, FWbemObject.Properties_.Item('NumberOfLogicalProcessors').Value);
      WriteVariant('    Version: '#9#9#9#9,             FWbemObject.Properties_.Item('Version').Value);
      FWbemObject := Unassigned;
    end;
  finally
    oEnum          := Unassigned;
    FWbemObjectSet := Unassigned;
    FWMIService    := Unassigned;
    FSWbemLocator  := Unassigned;
  end;
  except
    on E:EOleException do
      LogMsg(Format('EOleException %s %x', [E.Message,E.ErrorCode]));
     on E:Exception do
      LogMsg(E.Classname + ': ' + E.Message);
  end;
end;


€: hab grad versucht das ganze in einen Thread auszulagern und dort zu laden, aber das hat auch nix gebracht. Die Threads die beim Laden erstellt werden sind nachwievor vorhanden :(

MfG & Thx Bergmann.

_________________
Ich weiß nicht viel, lern aber dafür umso schneller^^