程序每小时要运行一个线程来处理一些数据, 考虑两种方法:
1. 相应WM_ONTIME消息, 在相应函数中开始一个线程
2. 程序执行起来就开启处理线程, 执行完使用Sleep(), 使程序睡眠1小时.
这两中方法那种好, 为什么?
目前我采用的是第一种, 因为我发现,Sleep()需要考虑线程执行时间, 不然会造成定时不准.
而WM_ONTIME就比较好用, 定时也比较准.而且, 用相应windows消息的方式, 启动消息后,线程运行完正常退出, 而使用Sleep()对于线程结束比较难把握.
现在我担心的是, 如果线程运行间隔时间变短, 比如5分钟运行一次, 会不会由于不断启动线程而带来问题.希望各位大侠帮助解答.

解决方案 »

  1.   

    1。 如果对运行效率要求不高,时间间隔不会太短,如1分钟换运行一次,那么用第一种方法简单,而且程序容易控制。
    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);
    }
      

  2.   

    在《Windows核心编程》中好像有定时对象,比这两种还好
      

  3.   

    我用的和jackieyoung(蓝帆)一样的