在窗体模式下, 我可以使用SetTimer(hWnd, TIMER_ID_NEW_LOG_CHECK_TIME, 1000, NULL);
KillTimer(hWnd, TIMER_ID_NEW_LOG_CHECK_TIME);
并在主窗体消息环中相应
case WM_TIMER:
     TIMER_ID_NEW_LOG_CHECK_TIME: //处理函数
     现在我在console模式下编程, 请教专家们, 因为Console没有消息环, 所以如何处理时间问题呢?
我一开始想的方法是, 做一个线程, 每次sleep(1000)然后判断时间是否到达, 可是这样做比较复杂,同时系统效率会降低.
请教好的设计思路模式或者编程方法, 有代码当然更好啦, 谢谢各位了

解决方案 »

  1.   

    其实很简单啊,就是在程序中while循环,每次读取一个时间来判断!例如:while(true) {
      ::GetCurrentTime(...)  //do your jobs
    }
      

  2.   

    应该可以把?
    使用GetTickCount比使用GetCurrentTime精确!
      

  3.   

    使用楼上的方法是可以, 但是资源释放是一个问题, CPU占用率是100%, 并且大部分时间是在空转.
      

  4.   

    楼住的想法其实就可以了,做一个单独的线程,里面Sleep你需要的时间,然后完成工作;另外在main函数里面先启动你的worker thread,再做一个循环使主函数不退出,比如可以以用户输入为条件结束的循环:
    TCHAR szBuffer[128];
    if(fgets(szBuffer, lstrlen(szBuffer), stdin))
    {
        //退出
    }
      

  5.   

    因为Sleep会影响计时的精度, 所以我不想使用Sleep挂起线程
      

  6.   

    我写了一个;诶,用于间隔时间处理,但是GetTickCount()有大概30毫秒的误差。线程处理也会有一定的误差,所以两项加起来就很可怕了。所以想请教一下精确计时在Console模式下的方法。我的类如下:
    //**********************************************
    //Create By: freeeyes
    //Date     : 2005-03-08
    //Target   : ³õʼ»¯Ê±¼äÀà, ´´½¨Ò»¸öʱ¼äÏß³Ì
    //**********************************************
    void CTimeSave::InitTimeSave(UINT nTime)
    {
    nSaveTime = nTime;
    nTargetTime = (UINT)GetTickCount() + nSaveTime; m_Thread = CreateThread(NULL, 0, TimeSave_Thread, (LPVOID)this, 0, NULL);
    if(NULL == m_Thread)
    {
    printf("\nInit Time Save Thread Error.");
    }
    }
    void CTimeSave::TimeSaveThread()
    {
    UINT       nCurrentTime;
    char       szLog[MAXCHARBUFF];
    SYSTEMTIME pTime;
    if(nSaveTime == 0)
    {
    printf("\nCreate TimeSave Thread Fail,because SaveTime = 0");
    return;
    }

    while(TRUE)
    {
    nCurrentTime = (UINT)GetTickCount();
    if(nCurrentTime >= nTargetTime)
    {
    GetLocalTime(&pTime);
                wsprintf(szLog, "\n[%02u:%02u:%02u] Time Is OK;", pTime.wHour, pTime.wMinute, pTime.wSecond); 
    printf(szLog);
    dbTcpServer.SendDBWorks();
    nTargetTime = nTargetTime + nSaveTime;
    }
    else
    {
    Sleep(100);
    }
    }
    return;
    }void CTimeSave::CLoseTimeSaveThread()
    {
    if(NULL != m_Thread)
    {
    CloseHandle(m_Thread);
    }
    }
      

  7.   

    我收藏中有一个很好的
    http://community.csdn.net/Expert/topic/2883/2883226.xml?temp=.708645
    其中
     LLnju(LLnju) 的方案是可行的,我试过