- 论坛徽章:
- 0
|
在windows下用settimer设置定时器会有很多不便之处,下面介绍一下用api实现的一个定时器的例子,希望对大家有帮助,这个例子是在主线程中启动一个线程用来考察变量状态,若变量满足条件,则启动定时器,如果当定时器没有超时的时候变量被改变,则停止定时器,否则激活。
void CALLBACK TimerAPCProc(//定时器调用函数
LPVOID lpArgToCompletionRoutine, // data value
DWORD dwTimerLowValue, // timer low value
DWORD dwTimerHighValue // timer high value
)
{
if(SetIP(AdapterInfoVector[0]->;strName, 0, "0.0.0.0", "0.0.0.0", "0.0.0.0" == TRUE)
AfxMessageBox("设置IP地址成功!" ;
else
AfxMessageBox("设置IP地址失败!" ;
}
int g_CommStatus;
UINT CheckNetStatusProc(LPVOID param)
{
int rc;
TCHAR szError[255];
HANDLE hTimer ;
LARGE_INTEGER liDueTime;
liDueTime.QuadPart = -ONE_SECOND;//1 s
hTimer = ::CreateWaitableTimer(NULL,FALSE,NULL);
GetAdapterInfo();
while(1)
{
rc = SetWaitableTimer(hTimer,
&liDueTime,
TEN_SECONDS,
TimerAPCProc,
NULL , 0);
if(g_CommStatus==-1)//down
{
while(1)
{
if(WaitForSingleObject(hTimer,0) == WAIT_OBJECT_0 )
{
if(g_CommStatus==1 || g_CommStatus==0)//net ok
{
CancelWaitableTimer(hTimer);
break;
}
else
{
SleepEx(INFINITE,TRUE);
}
}
else break;
}
}
Sleep(1000);
}
CloseHandle(hTimer);
return 0;
} |
|