MFC基于对话框的程序中,想周期性的实现数据读取的采样计算精确到毫秒。使用了timeSetEvent这个函数。
如下:#include <stdio.h>
#include <stdlib.h>
#include <windows.h>
#pragma comment(lib,"Winmm.lib")static void CALLBACK OneMilliSecondProc(UINT wTimerID, UINT msg,DWORD dwUser,DWORD dwl,double dw2) ;void CThermalMonitorDlg:: OneMilliSecondProc(UINT wTimerID, UINT msg,DWORD dwUser,DWORD dwl,double dw2) 
 {
                //周期性的读取采样与处理,大概是100毫秒,间隔1秒读取处理一次
 }
在OnInitDialog 中 调用:
UINT wTimerRes_1ms,wTimerRes_2s;//定义时间间隔 
UINT wAccuracy = 1; //定义分辨率 
UINT TimerID_1ms,TimerID_2s; //定义定时器句柄
wTimerRes_1ms = 1000;
double Frequency; timeSetEvent(wTimerRes_1ms,wAccuracy,(LPTIMECALLBACK)OneMilliSecondProc, // 回调函数
         Frequency, // 用户传送到回调函数的数据;
         TIME_PERIODIC); //周期调用定时处理函数运行后发现可以进入OneMilliSecondProc callback函数,但是在第二次进入函数处理完毕后会报错:Unhanle excption in ThemarMonitor.exe: 0xc0000005 :Access Vilocation.想问出错的原因使什么,以上调用方法是否正确。给个例子看看最好。
新人

解决方案 »

  1.   

    就是第一次调用函数结束之后,第二次调用结束挂掉。谁给个例子能正常使用的。是否是调用的位置不对不能在OnInitDialog里用
      

  2.   

    你的调用方法没有问题
    OneMilliSecondProc中是如何处理的?是否还有别的线程影响?
      

  3.   

    回调函数的参数类型错了,最后参数是4字节而double是8字节,返回之后栈指针就错了,所以后果无法预料。
    OneMilliSecondProc(UINT wTimerID, UINT msg,DWORD dwUser,DWORD dwl,double dw2)
    改为:
    OneMilliSecondProc(UINT wTimerID, UINT msg, DWORD dwUser, DWORD dwl, DWORD dw2)
      

  4.   

    楼上说的没错,楼主可能理解错误
    用户自定义参数应该是DWORD,并且不是dw2,而是dwUser才对LPTIMECALLBACK的定义应该是
    /* timer data types */
    typedef void (CALLBACK TIMECALLBACK)(UINT uTimerID, UINT uMsg, DWORD dwUser, DWORD dw1, DWORD dw2);
    typedef TIMECALLBACK FAR *LPTIMECALLBACK;
    如果你要传个double参数可以这样
    timeSetEvent(wTimerRes_1ms,wAccuracy,(LPTIMECALLBACK)OneMilliSecondProc,
             (DWORD)&Frequency,           // 自定义参数必须是DWORD型,因此,可以用来传指针
             TIME_PERIODIC);void CThermalMonitorDlg:: OneMilliSecondProc(UINT wTimerID, UINT msg,DWORD dwUser,DWORD dwl,double dw2)  
    {
        double* pfUser = (double*)dwUser;
        ……