1、timeSetEvent()这个函数的各个参数都是什么意思?用的时候怎么填?
它的那个回调函数怎么填?
2回调函数:
void CALLBACK TimeProc(
  UINT uID,      
  UINT uMsg,     
  DWORD dwUser,  
  DWORD dw1,     
  DWORD dw2      
);的各个参数是什么意思?具体怎么填??
3、这个回调函数放在哪里?(是所有函数的外面吗?)
4、最好给我个完整的例子??

解决方案 »

  1.   

    1.使用timeGetTime()函数   该函数定时精度为ms级,返回从Windows启动开始所经过的时间。由于使用该函数是通过查询的方式进行定时控制的,所以,应该建立定时循环来进行定时事件的控制。   2. 使用timeSetEvent()函数   利用该函数可以实现周期性的函数调用。函数的参数说明如下:  uDelay:延迟时间;   uResolution:时间精度,在Windows中缺省值为1ms;   lpFunction:回调函数,为用户自定义函数,定时调用;  dwUser:用户参数;  uFlags:标志参数;   TIME_ONESHOT:执行一次;   TIME_PERIODIC:周期性执行。   具体应用时,可以通过调用timeSetEvent()函数,将需要周期性执行的任务定义在lpFunction回调函数中(如:定时采样、控制等),从而完成所需处理的事件。需要注意的是:任务处理的时间不能大于周期间隔时间。另外,在定时器使用完毕后,应及时调用timeKillEvent()将之释放。   下面这段代码的主要功能是设置两个时钟定时器,一个间隔是1ms,一个间隔是2s。每执行一次,把当前系统时钟值输入文件“cure.out”中,以比较该定时器的精确度。 //定义1ms和2s时钟间隔,以ms为单位 # define ONE_MILLI_SECOND 1 # define TWO_SECOND 2000 //定义时钟分辨率,以ms为单位 # define TIMER_ACCURACY 1 //定义时间间隔 UINT wTimerRes_1ms,wTimerRes_2s; //定义分辨率 UINT wAccuracy; //定义定时器句柄 UINT TimerID_1ms,TimerID_2s; //打开输出文件“cure.out” CCureApp::CCureApp():fout(“cure.out”, ios::out) {  // 给时间间隔变量赋值  wTimerRes_1ms = ONE_MILLI_SECOND;  wTimerRes_2s = TWO_SECOND;  TIMECAPS tc;  //利用函数timeGetDevCaps取出系统分辨率的取值范围,如果无错则继续  if(timeGetDevCaps(&tc,sizeof(TIMECAPS))==TIMERR_NOERROR) {   //分辨率的值不能超出系统的取值范围  wAccuracy=min(max(tc.wPeriodMin, TIMER_ACCURACY),tc.wPeriodMax); //调用timeBeginPeriod函数设置定时器的分辨率 timeBeginPeriod(wAccuracy); //设置定时器 InitializeTimer();  } } CCureApp:: ~CCureApp() { //结束时钟 fout <<“结束时钟”<< endl; // 删除两个定时器 timeKillEvent(TimerID_1ms); 
    timeKillEvent(TimerID_2s); // 删除设置的分辨率 timeEndPeriod(wAccuracy); } void CCureApp::InitializeTimer() { StartOneMilliSecondTimer(); StartTwoSecondTimer(); } // 1ms定时器的回调函数,类似于中断处理程序,一定要声明为全局PASCAL函数,否则编译会有问题 void PASCAL OneMilliSecondProc(UINT wTimerID, UINT msg,DWORD dwUser,DWORD dwl,DWORD dw2) {  // 定义计数器 static int ms = 0; CCureApp *app = (CCureApp *)dwUser; // 取得系统时间,以ms为单位 DWORD osBinaryTime = GetTickCount(); //输出计数器值和当前系统时间 app->fout<<++ms<<“:1ms:” < 
    } // 加装1ms定时器 void CCureApp::StartOneMilliSecondTimer() { if((TimerID_1ms = timeSetEvent(wTimerRes_1ms, wAccuracy, // 回调函数 (LPTIMECALBACK) OneMil liSecondProc, // 用户传送到回调函数的数据 (DWORD)this, / *周期调用,只使用一次,用TIME_ONESHOT*/  TIME_PERIODIC)) == 0) { AfxMessageBox(“不能进行定时!”, MB_OK | MB_ICONASTERISK); } else //不等于0表明加装成功,返回此定时器的句柄 fout << “16ms 计 时:” << endl; } 
      

  2.   

    没太看明白你的代码,我的timeSetEvent函数是这样填的,这里TimeProc1是个回调函数
    timeSetEvent(20,1,TimeProc1,(DWORD)m_hWnd,TIME_PERIODIC);
    TimeProc1这个函数是这样的:void CALLBACK TimeProc1(UINT uID,DWORD dwUser);这里的
    参数好象不对,参数具体都是什么意思啊?
      

  3.   

    timeSetEvent(5,1,(LPTIMECALLBACK) MyFunc,0,TIME_PERIODIC);
    间隔5ms  精度1ms 函数   用户参数 周期调用 void PASCAL MyFunc(UINT uID, UINT uMsg,DWORD dwUser,DWORD dw1,DWORD dw2) {
    //UINT uID, UINT uMsg,DWORD dwUser,DWORD dw1,DWORD dw2这些的参数 几乎不用管(如果你用一个)
    }
      

  4.   

    用timeSetEvent设定事件的触发方式,各参数含义如下:
    参数1为定时间隔,2为设定程序所需的最小分辨率参数3为调用回调函数,4为用户提供的回调数据,5为每隔一定时间触发一次,如为TIME_ONESHOT事件仅触发一次,下面给出一个定时100ms的例子:
    m_Timer_ID=timeSetEvent(100,m_wAccuracy,(LPTIMECALLBACK)CatchMMTimer,0,TIME_PERIODIC);
    上述例子是我在一个工程项目上用的,没有问题。