j'ai développé un service Windows qui contrôle et rentabilise les session ICA et RDP sur les serveurs Citrix
de temps en temps le service ce fige sur la fonction WTSEnumerateSessions
il n'y a pas de plantage mais le processus reste bloqué sur l'appel de cette fonction en général lorsque que le serveur testé redémarre
d’où un blocage du service
ma question est comment éviter ce blocage ?
j'arrive à le détecter en vérifiant la date de modification du fichier de log
Je pensai passer par un thread mais s'il est bloqué je devrais utiliser TerminateThread pour arrêter le thread mais il me semble que ce n'est pas propre car générateur de fuite mémoire
Si l'un de vous a des pistes merci par avance
Voici la partie de code
procedure tRDSession.tester ;
var
hserveur : handle;
booOk : boolean;
ppsession : PWTS_SESSION_INFO;
nbSession : dword;
indexSession : dword;
Session : WTS_SESSION_INFO;
strTemp : string;
begin
fnbICA := 0;
fnbRDP := 0;
fbooListenICA := false;
fbooListenRDP := false;
fbooServeurOK := false;
if strServeur ='' then exit;
hserveur := WTSOpenServerA(pchar(fstrServeur));
if hserveur = 0 then exit;
try
// c'est là que çà fige
booOk := WTSEnumerateSessionsA(hserveur,0,1,ppsession,nbSession );
if booOk and (nbsession > 0 )then
begin
fbooServeurOK := true;
for indexSession := 0 to nbSession-1 do
begin
Session := PWTS_SESSION_INFO(integer(ppsession)+indexsession * sizeof(wts_session_info))^;
strTemp := lowercase(session.pWinStationName);
if pos('ica-tcp#',strtemp)<> 0 then inc(fnbICA ,1);
if pos('rdp-tcp#',strtemp)<> 0 then inc(fnbRDP ,1);
if strTemp = 'ica-tcp' then fbooListenICA := session.State = WTSListen;
if strTemp = 'rdp-tcp' then fbooListenRDP := session.State = WTSListen;
end;
WTSFreeMemory (ppsession );
end;
except
on e:exception do
fblog.add('Erreur : '+e.Message );
end;
WTSCloseServer(hserveur);
end;