多个定时器问题

时间:2022-12-23 23:25:39
我有一个console程序,一个main()主线程流程,需要定时从远程主机中读取实时信息(速度很快);主线程创建了一个子线程,该子线程会定时的从另外一个主机中读取有关的资料信息然后更新本地机器上的相关信息;我看到一段程序,可以实现子线程内的定时操作;但我想把这段代码移植到主线程中,但似乎病没有出现我要的结果,请高手指教。
void ChildHandle()
{
return;

DWORD dwChildThreadId;
printf("use timer in workthread of console application<masterz>\n");

/* 创建子线程 */
    HANDLE hChildThread = CreateThread( 
        NULL, /* 不需要进行安全设置 */
        0, /* 使用默认的堆栈大小 */
        ThreadProc, /* 线程回调函数 */
        0, /* 传递给线程函数的参数 */
        0, /* 使用默认的创建标志 */
        &dwChildThreadId);
/*
* 进行实际的等待操作
* *
*/
DWORD dwwait = WaitForSingleObject(hChildThread,1000*3600*24);

/* 处理实际的等待结果*/
switch(dwwait)
{
case WAIT_ABANDONED: /* 线程被抛弃 */
printf("main thread WaitForSingleObject return WAIT_ABANDONED\n");
break;
/* The state of the specified object is signaled.*/
case WAIT_OBJECT_0: /* 指定对象的状态是 */
printf("main thread WaitForSingleObject return WAIT_OBJECT_0\n");
break;
case WAIT_TIMEOUT: /* 超时了*/
printf("main thread WaitForSingleObject return WAIT_TIMEOUT\n");
break;
}
/* 关闭子线程*/
CloseHandle(hChildThread);
_getch();
}

unsigned long WINAPI ThreadProc(PVOID pvoid)
{
MSG msg;
    BOOL bRet;
int count =0;

PeekMessage(&msg, NULL, WM_USER, WM_USER, PM_NOREMOVE);

/* 设置定时器 */
UINT timerid = SetTimer(NULL,111,600,NULL);

/* 取回消息*/
while( (bRet = GetMessage( &msg, NULL, 0, 0 )) != 0)

if (bRet == -1)
{
// handle the error and possibly exit
}
else if(msg.message==WM_TIMER)
{
count++;
printf("WM_TIMER in Child thread count=%d\n",count);

// if(count>4)
// break;
}
else
{
TranslateMessage(&msg); 
DispatchMessage(&msg); 
}
}

/* 关闭定时器*/
KillTimer(NULL,timerid);

printf("thread end here\n");
return 0;
}

注意父线程子线程定时间隔不一样,但结束时间要求一样的。请高手指点。

7 个解决方案

#1


你要什么样的结果

#2


UINT timerid = SetTimer(NULL,111,600,NULL);
                                  ~~~~~~~~
                                 这样在线程中得不到WM_TIMER消息的
                                 必须指定一个窗口,WM_TIMER会发给该窗口

#3


我说的还不清楚嘛?这样说吧。一个父线程,有个定时操作,一个子线程,它也有个定时操作。没有窗口,我该怎么做?

#4


你的代码我编译运行了没什么不妥啊

#5


函数ChildHandle一开始就 return; ?

#6


haha,sorry,这个return得取消。

#7


关注

#1


你要什么样的结果

#2


UINT timerid = SetTimer(NULL,111,600,NULL);
                                  ~~~~~~~~
                                 这样在线程中得不到WM_TIMER消息的
                                 必须指定一个窗口,WM_TIMER会发给该窗口

#3


我说的还不清楚嘛?这样说吧。一个父线程,有个定时操作,一个子线程,它也有个定时操作。没有窗口,我该怎么做?

#4


你的代码我编译运行了没什么不妥啊

#5


函数ChildHandle一开始就 return; ?

#6


haha,sorry,这个return得取消。

#7


关注