![]() |
Re: Eigener Dienst -> Speicherauslastung wächst und wächs
Zitat:
hab ich was mit trunk update verpasst... ? |
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? |
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? |
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. |
Re: Eigener Dienst -> Speicherauslastung wächst und wächs
WideString!
Delphi-Quellcode:
wieso? haste noch ne Idee?
threadvar InternalThreadName : WideString;
|
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. |
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:
Delphi-Quellcode:
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...
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; hier noch meine GetCurrUserName funktion... (Vielleicht ist ja nur die falsch...)
Delphi-Quellcode:
z.b. showmessage('"'+GetSession'"') würde folgendes erzielen: Ausgabe["Username] das an den String angefügte, hier ein ", greifft nicht!
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; JMD eine Idee? so kann ich den Benutzername aber auch nicht gebrauchen... // EDIT: Kann ich nicht einfach den Username irgendwie aus dem Token bekommen? ... |
Re: Eigener Dienst -> Speicherauslastung wächst und wächs
CreateCompatibilityQueryUserToken sollte man wirklich nur im Ausnahmefall verwenden.
Delphi-Quellcode:
ist die beste Variante.
Token := TJwSecurityToken.CreateWTSQueryUserTokenEx(WTS_CURRENT_SERVER_HANDLE, WtsGetActiveConsoleSessionID);
Wenn du schon die Trunkversion hast, dann gibt es dazu die Methode : GetTokenUserName |
Re: Eigener Dienst -> Speicherauslastung wächst und wächs
hmm...
meinst du nicht eher:
Delphi-Quellcode:
aber anyway, wo kriege ich die SessionID her?!
CreateWTSQueryUserToken(SessionID: cardinal = INVALID_HANDLE_VALUE); overload; virtual;
|
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. |
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