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.想问出错的原因使什么,以上调用方法是否正确。给个例子看看最好。
新人
如下:#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.想问出错的原因使什么,以上调用方法是否正确。给个例子看看最好。
新人
OneMilliSecondProc中是如何处理的?是否还有别的线程影响?
OneMilliSecondProc(UINT wTimerID, UINT msg,DWORD dwUser,DWORD dwl,double dw2)
改为:
OneMilliSecondProc(UINT wTimerID, UINT msg, DWORD dwUser, DWORD dwl, DWORD dw2)
用户自定义参数应该是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;
……
}