程序每小时要运行一个线程来处理一些数据, 考虑两种方法:
1. 相应WM_ONTIME消息, 在相应函数中开始一个线程
2. 程序执行起来就开启处理线程, 执行完使用Sleep(), 使程序睡眠1小时.
这两中方法那种好, 为什么?
目前我采用的是第一种, 因为我发现,Sleep()需要考虑线程执行时间, 不然会造成定时不准.
而WM_ONTIME就比较好用, 定时也比较准.而且, 用相应windows消息的方式, 启动消息后,线程运行完正常退出, 而使用Sleep()对于线程结束比较难把握.
现在我担心的是, 如果线程运行间隔时间变短, 比如5分钟运行一次, 会不会由于不断启动线程而带来问题.希望各位大侠帮助解答.
1. 相应WM_ONTIME消息, 在相应函数中开始一个线程
2. 程序执行起来就开启处理线程, 执行完使用Sleep(), 使程序睡眠1小时.
这两中方法那种好, 为什么?
目前我采用的是第一种, 因为我发现,Sleep()需要考虑线程执行时间, 不然会造成定时不准.
而WM_ONTIME就比较好用, 定时也比较准.而且, 用相应windows消息的方式, 启动消息后,线程运行完正常退出, 而使用Sleep()对于线程结束比较难把握.
现在我担心的是, 如果线程运行间隔时间变短, 比如5分钟运行一次, 会不会由于不断启动线程而带来问题.希望各位大侠帮助解答.
2。 第二种方法不方便程序的同步控制。在Sleep期间,该线程得不到控制.如果该线程创建了窗口,消息就得不到处理,容易形成死循环。另外,由该线程创建的资源,如new一个对象,在进程退出时就无法正常得到释放。因此,尤其不适合于长时间Sleep。
3。 第三种方法:将1、2结合。程序启动就开启处理线程,然后等待处理事件通知;利用WM_ONTIME消息触发处理事件。例子:
UINT WINAPI ThreadProc(LPVOID lpParam)
{
DWORD dwRet;
MSG msg;
HANDLE hResumeThreadEvent = (HANDLE) lpParam;
int i = 0;
while(1)
{
dwRet = MsgWaitForMultipleObjects( 1, // One event to wait for
&hResumeThreadEvent, // The array of events
FALSE, // Wait for 1 event
INFINITE, // Timeout value
QS_ALLINPUT); // Any message wakes up
if(dwRet == WAIT_OBJECT_0)
{
// Put your code here
ResetEvent(hResumeThreadEvent);
} else if(dwRet == WAIT_OBJECT_0 + 1)
{
// There is a window message available. Dispatch it.
while(PeekMessage(&msg,NULL,NULL,NULL,PM_REMOVE))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
} else
{
// Something else happened. Return.
return FALSE;
}
}}void CThread_TestDlg::OnTimer(UINT nIDEvent)
{
// TODO: Add your message handler code here and/or call default
if (nIDEvent == 1)
{
SetEvent(m_hResumeThreadEvent);
}
CDialog::OnTimer(nIDEvent);
}