查看以下代码:
DWORD WINAPI TimerThrd(LPVOID lpParameter)
{
MSG msg;
HANDLE hTimer;
LARGE_INTEGER li = {0}; // Create an auto-reset timer.
hTimer = CreateWaitableTimer(NULL, FALSE, NULL);
const int nSecond = 10000000;
//3秒进行一次报时
SetWaitableTimer(hTimer, &li, 3* 1000,NULL, NULL, FALSE); while (WaitForSingleObject(hTimer,INFINITE) == WAIT_OBJECT_0) //内核hTimer变成已通知状态
{
if (PeekMessage(&msg,NULL,0,0,PM_REMOVE)) {
if (msg.message == WM_QUIT)
break; //线程退出
}
else {
//内核hTimer变成已通知状态后,开线程处理些事务
HANDLE hddeal = CreateThread(NULL, 0, Dosomething, NULL, NULL, NULL);
CloseHandle(hddeal);
}
}
return 0;
}
这里我如果要结束这个线程的话,暂时用的办法是:PostThreadMessage(TimerThrd的线程ID,WM_QUIT,0,0).
那么要等到定时器内核对象hTimer变为通知,然后收到WM_QUIT才能退出。
我现在想即时让线成终止(本来想用ExitThread,但会造成该线程里的资源不能释放),有什么方法能实现么?
DWORD WINAPI TimerThrd(LPVOID lpParameter)
{
MSG msg;
HANDLE hTimer;
LARGE_INTEGER li = {0}; // Create an auto-reset timer.
hTimer = CreateWaitableTimer(NULL, FALSE, NULL);
const int nSecond = 10000000;
//3秒进行一次报时
SetWaitableTimer(hTimer, &li, 3* 1000,NULL, NULL, FALSE); while (WaitForSingleObject(hTimer,INFINITE) == WAIT_OBJECT_0) //内核hTimer变成已通知状态
{
if (PeekMessage(&msg,NULL,0,0,PM_REMOVE)) {
if (msg.message == WM_QUIT)
break; //线程退出
}
else {
//内核hTimer变成已通知状态后,开线程处理些事务
HANDLE hddeal = CreateThread(NULL, 0, Dosomething, NULL, NULL, NULL);
CloseHandle(hddeal);
}
}
return 0;
}
这里我如果要结束这个线程的话,暂时用的办法是:PostThreadMessage(TimerThrd的线程ID,WM_QUIT,0,0).
那么要等到定时器内核对象hTimer变为通知,然后收到WM_QUIT才能退出。
我现在想即时让线成终止(本来想用ExitThread,但会造成该线程里的资源不能释放),有什么方法能实现么?
消息
{if(x=WAIT_OBJECT_0)
{
}
}
不等时间,消息优先吗..
这里每隔3S内核ShTimer就变成已通知状态,是个循环。按你的意思是就是只等一次hTimer吧!
while(1)
{
DWORD x=WaitForSingleObject(hTimer,0); 测试对象立刻返回
PeekMessage(&msg,NULL,0,0,PM_REMOVE);
if (msg.message == WM_QUIT)break; //线程退出
if(x==WAIT_OBJECT_0)信号态处理
{
...........
}
}
就是不等hTimer
这是改后的代码:
DWORD WINAPI TimerThrd(LPVOID lpParameter)
{
MSG msg;
HANDLE hTimer,hddeal;
LARGE_INTEGER li = {0}; // Create an auto-reset timer.
hTimer = CreateWaitableTimer(NULL, FALSE, NULL);
const int nSecond = 10000000;
//3秒进行一次报时
SetWaitableTimer(hTimer, &li, 3* 1000,NULL, NULL, FALSE); while (1) //内核hTimer变成已通知状态
{
DWORD dwResult = MsgWaitForMultipleObjects(1,&hTimer,FALSE,INFINITE,QS_ALLEVENTS);
switch(dwResult)
{
case WAIT_OBJECT_0: // The event became signaled. //内核hTimer变成已通知状态后,开线程处理些事务
hddeal = CreateThread(NULL, 0, Dosomething, NULL, NULL, NULL);
CloseHandle(hddeal);
break;
case WAIT_OBJECT_0 + 1: // A message is in our queue.
if (PeekMessage(&msg,NULL,0, 0, PM_REMOVE)) {
if (msg.message == WM_MYMSG)
return 0; //线程退出
}
break;
}
}
return 0;
}