j'avais besoin d'exécuter une routine temporisée avant la fermeture d'un process
un simple timer n'était pas utilisable car je ne contrôle pas cette fermeture qui peut intervenir avant l'expiration du timeout
j'ai choisi la technique du waitabletimer pour éviter de me compliquer la vie avec la création d'un thread
classiquement ce genre de truc sert surtout de timer de précision et comme il y a très peu d'exemple pour delphi dispo sur le net
voici ma contribution
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
uses Windows
implementation
var
 hTimer: THANDLE;
 liDueTime : LARGE_INTEGER;
procedure ExecOnWaitableTimer(const lpArgs:Pointer; const dwTimerLowValue, dwTimerHighValue:LongWord);stdcall;
begin
  //lpArgs est utilisé à titre d'exemple de transmission de paramètres
  if LongInt(lpArgs) = -1 then MessageBox(0,'Ok','Test',0);
end; 
 
function toto;
  liDueTime.QuadPart := -10000 * 250; //timeout 250ms
  hTimer:=CreateWaitableTimer(nil,True,nil);
  if not SetWaitableTimer(hTimer,TLargeInteger(liDueTime),0,@ExecOnWaitableTimer,Pointer(-1),False) then MessageBox(0,'Waitable timer error','error',0);
 
procedure OnExit;
begin
//arrêt jusqu'à la fin du timeout
//la routine d'achèvement ne sera exécutée que si le thread est placé en mode "alertable" d'où le SleepEx pour pomper la file d'attente APC
  if WaitForSingleObjectEx(hTimer,INFINITE,True) = WAIT_OBJECT_0 then SleepEx(0,True);
end;
Ah oui dernier point, SetWaitableTimer est vérolé jusqu'à la D4, j'ai dû rectifier Windows.pas