timeSetEvent(
1000,
10,
(LPTIMECALLBACK)funcall,
(DWORD) 0,
TIME_PERIODIC );
funcall函数执行一次用时10*1000,
我调试中发现:funcall每10*1000调用一次,与timeSetEvent中设置的每1000调用一次有区别,
请问我怎样改成-funcall确定1000执行一次???(funcall函数虽然执行一次用时10*1000,但我考虑了短时间调用的问题,函数内头部有判断:如果上一次没有执行完毕,本次直接退出。)

解决方案 »

  1.   

    MMRESULT timeSetEvent(
      UINT uDelay,
      UINT uResolution,
      LPTIMECALLBACK fptc,
      DWORD dwUser,
      UINT fuEvent
    );Parameters
    uDelay
    [in] Event delay, in milliseconds. 
    If this value is not in the range of the minimum and maximum event delays supported by the timer, the function returns an error. uResolution
    [in] Resolution of the timer event, in milliseconds. 
    The resolution increases with smaller values; a resolution of zero indicates periodic events should occur with the greatest possible accuracy. To reduce system overhead, however, you should use the maximum value appropriate for your application. 
      

  2.   

    timeSetEvent( 
    1000, 
    10, 
    (LPTIMECALLBACK)funcall, 
    (DWORD) 0, 
    TIME_PERIODIC ); 的意思是说,每1000ms会产生一次事件,并不是真的执行一次.
    事件会触发funcall函数执行.而每次执行的时间当然需要依赖于funcall的执行时间了.
    楼主问:请问我怎样改成-funcall确定1000执行一次??? 
    答:1.使你的funcall函数用时减少到1000以内.
    2.若funcall函数支持重入,并且线程安全的话,你可以使用多线程来达到你的目的,即每隔1000ms执行一下funcall,若funcall函数执行一次用时还是10*1000的话,那么会同时有10个线程在运行.
    希望对你有帮助.
      

  3.   

    的意思是说,每1000ms会产生一次事件,并不是真的执行一次. ???
    事件是系统处理,还是应用程序处理???
    我想说的是,我想得到这个事件,以判断funcall程序执行时间超过了1000.怎样得到这个事件呢???
      

  4.   

    刚才我自己写了一个测试该函数的Demo,更具体的情况应该是这样的:
    1.timeSetEvent之后,应用程序会再创建一个线程,该线程定期处理事件,并且会调用funcall,因此函数funcall中,若有变量在主线程中也会用到的话,则要作好保护,有可能两个线程会同时访问它们.所以,第一问题的答案就是,每1000ms产生一次事件,并不是真的执行一次.
    2.事件是由应用程序创建出来的线程来执行的,因此属于应用程序来处理,但该线程并不是程序员自己创建的,因为在funcall中,我打印出来当前线程ID值就是新创建线程的ID值.这是第二个问题的答案.
    3.我目前还无法得到怎样得到该事件,比如说是否使用了线程的消息模型,还是有其它手法,那是操作系统的实现机制,需要更进一步的分析.但若你想知道funcall的时间的话,可以在函数首尾调用GetTickCount等函数来得到其运行时间.希望对你有用.
      

  5.   

    欢迎fm810参与下面的问题:CSDN-CSDN社区-VC/MFC-硬件/系统
    timeSetEvent回调函数超时问题???[问题点数:40分]    *
        * baodingwang
        * (王)
        *
        * 等 级:
        * 结帖率:100.00%
        *
    楼主发表于:2010-02-02 14:33:39
    timeSetEvent(
    1000,
    10,
    (LPTIMECALLBACK)funcall,
    (DWORD) 0,
    TIME_PERIODIC );
    funcall函数执行一次用时10*1000,
    我调试中发现:funcall每10*1000调用一次,与timeSetEvent中设置的每1000调用一次有区别,
    请问我怎样改成-funcall确定1000执行一次???(funcall函数虽然执行一次用时10*1000,但我考虑了短时间调用的问题,函数内头部有判断:如果上一次没有执行完毕,本次直接退出。)