我的多线程应用中要定时、循环,并且需要同步的执行一些任务,我用CreateWaitableTimer创建了一个定时器对象,并用WaitForSingleObject等待信号出现,正常情况下这样用没问题,但是当我的程序要退出时,因为这些等待中的线程都被挂起了,如何使这些线程立即获得信号(换句话说就是强制终止等待信号状态)并退出代码是一个头痛的问题,有什么办法可以使得这些等待中的线程全部获得信号并退出循环?
var
lpDueTime: Int64; //延迟
lPeriod: Integer; //周期
lpTimerName: PChar;
begin
lpTimerName := PChar('Knowing'+IntToStr(Handle)); //定时内核对象名
lPeriod := Trunc(FInterval*1000); //周期
lpDueTime := 0-1*100*10000; //0-lPeriod*10000;//负数为相对时间:定时器何时开始有信号,这个参数能精确到100纳秒
hTimerEvent := CreateWaitableTimer(nil, False, lpTimerName); //第二个参数为是否手动重置
SetWaitableTimer(hTimerEvent, lpDueTime, lPeriod, nil, nil, False);
procedure TIntrThr.Execute;
begin repeat
if Terminated then Break;
if WaitForSingleObject(hTimerEvent,INFINITE) = WAIT_OBJECT_0 then //如果信号不出现将一直等下去
begin
//do sth.
end;
until false;
end;
var
lpDueTime: Int64; //延迟
lPeriod: Integer; //周期
lpTimerName: PChar;
begin
lpTimerName := PChar('Knowing'+IntToStr(Handle)); //定时内核对象名
lPeriod := Trunc(FInterval*1000); //周期
lpDueTime := 0-1*100*10000; //0-lPeriod*10000;//负数为相对时间:定时器何时开始有信号,这个参数能精确到100纳秒
hTimerEvent := CreateWaitableTimer(nil, False, lpTimerName); //第二个参数为是否手动重置
SetWaitableTimer(hTimerEvent, lpDueTime, lPeriod, nil, nil, False);
procedure TIntrThr.Execute;
begin repeat
if Terminated then Break;
if WaitForSingleObject(hTimerEvent,INFINITE) = WAIT_OBJECT_0 then //如果信号不出现将一直等下去
begin
//do sth.
end;
until false;
end;
begin
CloseHandle(hTimerEvent);
end;