Delphi-PRAXiS
Seite 3 von 5     123 45      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   Delphi Eigener Dienst -> Speicherauslastung wächst und wächst... (https://www.delphipraxis.net/112046-eigener-dienst-speicherauslastung-waechst-und-waechst.html)

cherry 21. Apr 2008 17:11

Re: Eigener Dienst -> Speicherauslastung wächst und wächs
 
Zitat:

Zitat von Dezipaitor
mach getSession raus und nutze stattdessen deinen Benutzername. Wenn es immernoch ein Speicherleck gibt, dann ist es was anderes.

Hab ich gemacht, das Problem scheint schon daran zu liegen. Nehm ich das raus, bleibt die Speicherauslastung mit ca 8'752K stabil...

hab ich was mit trunk update verpasst... ?

Remko 21. Apr 2008 22:16

Re: Eigener Dienst -> Speicherauslastung wächst und wächs
 
I tested the code and my results on Vista SP1/D2007 are as follows:
Neither Eurekalog nor FastMM detects a memory leak, yet taskmanager shows an increase in memory usage. So there seems to be a memory leak but I am not sure if we are leaking the code in Jwscl or somewhere in an API call.

Could you please indicate your OS version?

cherry 22. Apr 2008 09:18

Re: Eigener Dienst -> Speicherauslastung wächst und wächs
 
Mein Betriebssystem ist:

Windows XP Professional Version 2002 SP2

...

Ich denke aber ich hab was beim Update der Subversion von JEDI falsch gemacht... respektive beim kompillieren... ich hab danach nur "JWSCL\jedi-api-lib\jwapi\trunk\Packages\bds10\JediApi_Bds10.bdsgr oup" geöffnet und die dort enthaltenen Units neu kompilliert. Nicht aber z.B. die pas Dateien unter: ...\JWSCL\jedi-api-lib\jwscl\trunk\source

muss ich die auch noch? oder muss ich sonst noch was neu kompillieren? oder reicht "JediApi_Bds10.bdsgroup" aus?

Dezipaitor 22. Apr 2008 09:21

Re: Eigener Dienst -> Speicherauslastung wächst und wächs
 
XP 2002 SP2 ? hab ich was verpasst?

schau mal in die Unit JwsclUtils.pas und suche nach der Variablen: InternalThreadName . Welchen Typ hat die?

JWSCL wird nicht, wie die JWA einzeln kompiliert.
Man kompiliert die JWA in dcu Dateien nur damit ein Rebuild des Projektes nicht so ewig dauert.

cherry 22. Apr 2008 09:27

Re: Eigener Dienst -> Speicherauslastung wächst und wächs
 
WideString!

Delphi-Quellcode:
threadvar InternalThreadName : WideString;
wieso? haste noch ne Idee?

Dezipaitor 22. Apr 2008 11:19

Re: Eigener Dienst -> Speicherauslastung wächst und wächs
 
Also bei mir erkennt kein Memorymanager ein Leak. Wenn ich Private Memory Data von einem Testprogramm anschaue, dann sieht man aber einen Anstieg des Speicherverbrauchs. Da kein Memorymanager in Delphi, dieses erkennt, ist meine Schlussfolgerung, dass der Speicher nicht durch die Delphianwendung direkt erzeugt wird (kein Objekt, kein GetMem usw). Da er ja sonst angezeigt werden würde.

Das Problem sind die WTSxxx Funktionen, welche Private Memory resevieren. Obwohl WTSFreeMemory dafür aufgerufen wird, konnte ich nicht sehen, dass Private Memory weniger wurde. Entweder ist das ein Bug von MS, oder ich blicke nicht ganz durch.
Intern ruft WTSFreeMemory auch nur LocalFree auf.

cherry 22. Apr 2008 15:17

Re: Eigener Dienst -> Speicherauslastung wächst und wächs
 
schade, ich denke wir werden nie rauskriegen wo das Problem liegt...

ich versuch das Problem jetz halt so zu umgehen:

Zitat:

Zitat von Dezipaitor
Du kannst auch schneller an den Benutzernamen der Session 0 herankommen.
Siehe http://blog.delphi-jedi.net/2008/04/...m-a-service-2/

hab das jetzt mal so gemacht:

Delphi-Quellcode:
function TSisterWatch.GetSession: string;
begin
  try
   Token := TJwSecurityToken.CreateCompatibilityQueryUserToken(MAXIMUM_ALLOWED, 'explorer.exe');
   Token.ImpersonateLoggedOnUser;
   //do stuff on user’s behalf
   Result := GetEnvironmentVariable('USERNAME');
  except
   Result := '';
  end;
  Token.RevertToSelf;
  Token.Free;
end;
funktioniert aber leider nicht. Ich hab auch schon probiert mit GetCurrUserName statt mit GetEnvironmentVariable('USERNAME') dort erhalte ich zwar sogar als Dienst den richtigen Username, allerdings ist der String irgendwie korrupt oder viel zu lang oder schneidet mir was ab oder weissnichtwas...

hier noch meine GetCurrUserName funktion... (Vielleicht ist ja nur die falsch...)

Delphi-Quellcode:
function GetCurrUserName: string;
var
  Size             : DWORD;
begin
  Size := MAX_COMPUTERNAME_LENGTH + 1;
  SetLength(Result, Size);
  if GetUserName(PChar(Result), Size) then
    SetLength(Result, Size)
  else
    Result := '';
end;
z.b. showmessage('"'+GetSession'"') würde folgendes erzielen: Ausgabe["Username] das an den String angefügte, hier ein ", greifft nicht!

JMD eine Idee?
so kann ich den Benutzername aber auch nicht gebrauchen...

// EDIT:

Kann ich nicht einfach den Username irgendwie aus dem Token bekommen?

...

Dezipaitor 22. Apr 2008 15:42

Re: Eigener Dienst -> Speicherauslastung wächst und wächs
 
CreateCompatibilityQueryUserToken sollte man wirklich nur im Ausnahmefall verwenden.

Delphi-Quellcode:
Token := TJwSecurityToken.CreateWTSQueryUserTokenEx(WTS_CURRENT_SERVER_HANDLE, WtsGetActiveConsoleSessionID);
ist die beste Variante.

Wenn du schon die Trunkversion hast, dann gibt es dazu die Methode : GetTokenUserName

cherry 22. Apr 2008 15:47

Re: Eigener Dienst -> Speicherauslastung wächst und wächs
 
hmm...

meinst du nicht eher:
Delphi-Quellcode:
CreateWTSQueryUserToken(SessionID: cardinal = INVALID_HANDLE_VALUE); overload; virtual;
aber anyway, wo kriege ich die SessionID her?!

Dezipaitor 22. Apr 2008 16:02

Re: Eigener Dienst -> Speicherauslastung wächst und wächs
 
die Ex Version funktioniert auch unter Windows 2000.
WtsGetActiveConsoleSessionID gibt die die SessionID vom physisch eingeloggten Benutzer.


Alle Zeitangaben in WEZ +1. Es ist jetzt 01:52 Uhr.
Seite 3 von 5     123 45      

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz