Bonjour

j'ai développé un service Windows qui contrôle et comptabilise 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é est en cours de redémarrage
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
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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
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 ici que cela ce 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;