控制台应用程序(console)可以使用定时器吗?(就象unix下可以用alarm信号定时)定时执行某个函数?

解决方案 »

  1.   

    好像不行,方正我是没有找到,只有用线程+Sleep来实现了。
      

  2.   

    好象不行的,Win32中的Timer是靠发消息的,而消息的处理必须有窗口.
    如果要求定时执行某个函数要求不很精确的话可以用waitforsingleobject(),sleep()等等..
    呵呵,其他高手指教....
      

  3.   

    我自定义了一个TIMEPROC,用在SetTimer里
    SetTimer(0,0,1000,myfunc)
    返回值为 〉0的,也就是成功调用settimer
    可是,1秒以后,没有执行那个函数myfunc!!!!
    (函数的定义是正确的,通过写文件来判断是否执行!)注意:这是在console程序里(以main()开始的)麻烦指教void myfunc(long hwnd ,int uMsg , int idEvent ,long dwTime)
    {
        FILE * fp ;
    if((fp = fopen("test.txt","w")) ==NULL) return ;
    fputs("success",fp);
    fclose(fp);
    return ;
    }
      

  4.   

    我自定义了一个TIMEPROC,用在SetTimer里
    SetTimer(0,0,1000,myfunc)
    0A返回值为 〉0的,也就是成功调用settimer
    可是,1秒以后,没有执行那个函数myfunc!!!!
    (函数的定义是正确的,通过写文件来判断是否执行!)注意:这是在console程序里(以main()开始的)麻烦指教void myfunc(long hwnd ,int uMsg , int idEvent ,long dwTime)0D
    {
        FILE * fp ;
    if((fp = fopen("test.txt","w")) ==NULL) return ;
    fputs("success",fp);
    fclose(fp);
    return ;
    }---------------
    路漫漫其修远兮
    吾将上下而求索
    ---------------
      

  5.   

    当然可以的。
    你可以定义一个timeevent
    在while()中用waitforMutilObject()来取得是timeevent事件
      

  6.   

    http://vip.6to23.com/NowCan1/tech/timer.htm
    那这个呢。
      

  7.   

    我的意思是不影响主程序的运行,就象信号处理一样
    是否有类似unix下的SIG_ALARM的东西。。
      

  8.   

    SetTimer是基于消息循环的,你这样用不行。
    用事件吧,像楼上lizmei001(暗黑) 所说
      

  9.   

    好象不行的,Win32中的Timer是靠发消息的,定义了一个TIMEPROC,用在SetTimer里
    SetTimer(0,0,1000,myfunc)
    0A返回值为 〉0的,也就是成功调用settimer
    可是,1秒以后,没有执行那个函数myfunc!!!!
      

  10.   

    LARGE_INTEGER liDueTime;HANDLE _hTimer
    _hTimer = CreateWaitableTimer(NULL, FALSE, NULL);
    liDueTime.QuadPart = -2000000; //-20000000;
    SetWaitableTimer(_hEiodTimer, &liDueTime, 5000, NULL, NULL, 0);
    HANDLE evantHandles[0] = _hTimer;
    ....
    while(1)
    {
       int dwWaitRes = WSAWaitForMultipleEvents(4, eventHandles, FALSE, WSA_INFINITE, FALSE)
       if(dwWaritRes == WSA_WAIT_EVENT_0)
          {//the set timer event is touching off and wirte you code this
    }
    }
      

  11.   

    我还要做别的事呢!在主函数里(监控端口)。
    楼上 lizmei001(暗黑)  的代码是对的,可是我不太好用。(考虑到移植、封装性。。)我找到了一个,timeSetEvent可是
    #include <stdio.h>
    #include <windows.h>
    #include <mmsystem.h>
    void sig_forwin(long hwnd ,int uMsg , int dwUser ,long dw1 , long dw2)
    {
    printf("\nOK\n");
    }int main()
    {
    long ret ;

    ret = timeSetEvent(1000,0,( LPTIMECALLBACK )sig_forwin,0,TIME_ONESHOT);
    printf("ret = %d\n",ret);
    getchar(); return 0 ;
    }这段代码在屏幕上打印出 OK 后出错!
    望指教!
      

  12.   

    知道原因了:)回到该主题:
    显然,用SetTimer不能实现功能。可以使用 lizmei001(暗黑) 的代码实现
    但是也可以使用我的刚才的代码
    将定义
    void sig_forwin(long hwnd ,int uMsg , int dwUser ,long dw1 , long dw2)修改为
    void CALLBACK sig_forwin(long hwnd ,int uMsg , int dwUser ,long dw1 , long dw2)一样能实现!他用的是多媒体定时器。需要 winmm.lib 支持
      

  13.   

    应该可以用的吧。
    int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance,
                        PSTR szCmdLine, int iCmdShow)
    {   
        int nID=SetTimer(0,0,2000,SetTime);
        MSG msg;
        GetMessage(&msg,NULL,0,0);
        if(msg.message==WM_TIMER)
        {
            MesssgeBox(NULL,"定时结束","",0);
            KillTiemr(nID);
        }
        return 0;
    }