多媒体定时器用法?

VCAlice 2013-01-09 10:29:44
想用多媒体定时器方法在编辑框内显示每秒不断增加的数字。可是总是出错,大家帮我看下程序。如果需要把a设置为全局变量的话,我应该怎么设置啊,是个初学者,希望大家多指教!
1 在对话框的头文件中定义代码
class CTimerSampleDlg : public CDialog
{
…….
static void CALLBACK TimeProc(UINT uID,UINT uMsg,
DWORD dwUser,DWORD dw1,DWORD dw2); // 定时器回调函数
int TimerID; // 定时器ID
…….
};

2 在OnButtonstarttimer添加启动多媒体定时器的语句
void CTimerSampleDlg::OnButtonstarttimer() 
{
TimerID = timeSetEvent(100,1,TimeProc,0,TIME_PERIODIC);
}

3 回调函数
void CALLBACK CTimerSampleDlg::TimeProc(UINT uID,UINT uMsg, DWORD dwUser,DWORD dw1,DWORD dw2)
{
m_Cal=m_Cal+1;
}

4在OnTimer中增加代码显示Cal的值。
void CTimerSampleDlg::OnTimer(UINT nIDEvent) 
{
m_Edit2=m_Cal;
UpdateData(FALSE);
CDialog::OnTimer(nIDEvent);
}
...全文
282 25 打赏 收藏 转发到动态 举报
写回复
用AI写文章
25 条回复
切换为时间正序
请发表友善的回复…
发表回复
BeanJoy 2013-07-17
  • 打赏
  • 举报
回复
引用 24 楼 hu83369766 的回复:
[quote=引用 23 楼 BeanJoy 的回复:] [quote=引用 22 楼 hu83369766 的回复:] [quote=引用 4 楼 BeanJoy 的回复:] [quote=引用 2 楼 VCAlice 的回复:] 1我程序里另外一个编辑框用的就是SetTimer。 2TimeProc不设置为对话框类的静态函数的话,程序就会出错。现在的错误只是a没有声明。我不知道怎么声明全局变量。
报什么错?报错就解决。我还想知道a是什么东西?你贴出的代码中可没有工。 windows下定时器,参考Timers Tutorial 代码如下:

void CTimersDlg::OnButtonBegin()
{
	.
	.
	.
    // Set resolution to the minimum supported by the system

    TIMECAPS tc;
    timeGetDevCaps(&tc, sizeof(TIMECAPS));
    m_uResolution = min(max(tc.wPeriodMin, 0), tc.wPeriodMax);
    timeBeginPeriod(resolution);

    // create the timer

    m_idEvent = timeSetEvent(
        m_elTime,
        resolution,
        TimerFunction,
        (DWORD)this,
        TIME_PERIODIC);
}

void CTimersDlg::OnButtonStop()
{
    // destroy the timer
    timeKillEvent(m_idEvent);

    // reset the timer
    timeEndPeriod (m_uResolution);
}

void CTimersDlg::MMTimerHandler(UINT nIDEvent) // called every elTime milliseconds
{
// do what you want to do, but quickly
	.
	.
	.
}

void CALLBACK TimerFunction(UINT wTimerID, UINT msg,
    DWORD dwUser, DWORD dw1, DWORD dw2)
    {
    // This is used only to call MMTimerHandler

    // Typically, this function is static member of CTimersDlg

    CTimersDlg* obj = (CTimersDlg*) dwUser;
    obj->MMTimerHandler(wTimerID);
    }
看到没?TimerFunction是回调函数,在其中再调用对话框的MMTimerHandler,而不是把对话框类的静态成员函数设置为回调。[/quote] 回调函数里再调用对话框类的一个函数 和直接在回调函数里实现相应功能 有什么区别呢 比如说我想在对话框中显示一些东西 若直接在全局的回调函数里实现,则还需要传递对话框句柄什么的 现在用你这个方法是不是就不需要了呢?[/quote] 两者最大的区别在于,在对话框类的函数里,可以使用对话框类的成员变量,而在回调函数中,如果没有对话框类的指针,你是无法使用对话框类的成员变量。 [/quote] 嗯 是啊 我最近正在试图使用多媒体定时器替换原来的系统定时器ontimer()。 之前我就是简单的把所有的对话框类的成员变量都用对话框类的指针指一下,但是SetItemText()函数总是报错,之前ontimer()里这个函数里只有两个参数,我也不明白为什么,但是在多媒体定时器中编译时他就提示我参数不够,唉 那我用你得方法这个会得到解决么 是不是可以直接将ontimer里的代码复制进去就可以啦? 还有我不太明白你得MMTimerHandler(UINT nIDEvent)函数里的 nIDEvent这个参数有什么用呢? 怎么用呢[/quote] 你看我4楼的回复,照着做,先编译通过了,再考虑其他的。回调函数里先可以什么都不做,等编译通过,单步调试没问题后再尝试加其他代码。
人见人厌 2013-07-17
  • 打赏
  • 举报
回复
引用 23 楼 BeanJoy 的回复:
[quote=引用 22 楼 hu83369766 的回复:] [quote=引用 4 楼 BeanJoy 的回复:] [quote=引用 2 楼 VCAlice 的回复:] 1我程序里另外一个编辑框用的就是SetTimer。 2TimeProc不设置为对话框类的静态函数的话,程序就会出错。现在的错误只是a没有声明。我不知道怎么声明全局变量。
报什么错?报错就解决。我还想知道a是什么东西?你贴出的代码中可没有工。 windows下定时器,参考Timers Tutorial 代码如下:

void CTimersDlg::OnButtonBegin()
{
	.
	.
	.
    // Set resolution to the minimum supported by the system

    TIMECAPS tc;
    timeGetDevCaps(&tc, sizeof(TIMECAPS));
    m_uResolution = min(max(tc.wPeriodMin, 0), tc.wPeriodMax);
    timeBeginPeriod(resolution);

    // create the timer

    m_idEvent = timeSetEvent(
        m_elTime,
        resolution,
        TimerFunction,
        (DWORD)this,
        TIME_PERIODIC);
}

void CTimersDlg::OnButtonStop()
{
    // destroy the timer
    timeKillEvent(m_idEvent);

    // reset the timer
    timeEndPeriod (m_uResolution);
}

void CTimersDlg::MMTimerHandler(UINT nIDEvent) // called every elTime milliseconds
{
// do what you want to do, but quickly
	.
	.
	.
}

void CALLBACK TimerFunction(UINT wTimerID, UINT msg,
    DWORD dwUser, DWORD dw1, DWORD dw2)
    {
    // This is used only to call MMTimerHandler

    // Typically, this function is static member of CTimersDlg

    CTimersDlg* obj = (CTimersDlg*) dwUser;
    obj->MMTimerHandler(wTimerID);
    }
看到没?TimerFunction是回调函数,在其中再调用对话框的MMTimerHandler,而不是把对话框类的静态成员函数设置为回调。[/quote] 回调函数里再调用对话框类的一个函数 和直接在回调函数里实现相应功能 有什么区别呢 比如说我想在对话框中显示一些东西 若直接在全局的回调函数里实现,则还需要传递对话框句柄什么的 现在用你这个方法是不是就不需要了呢?[/quote] 两者最大的区别在于,在对话框类的函数里,可以使用对话框类的成员变量,而在回调函数中,如果没有对话框类的指针,你是无法使用对话框类的成员变量。 [/quote] 嗯 是啊 我最近正在试图使用多媒体定时器替换原来的系统定时器ontimer()。 之前我就是简单的把所有的对话框类的成员变量都用对话框类的指针指一下,但是SetItemText()函数总是报错,之前ontimer()里这个函数里只有两个参数,我也不明白为什么,但是在多媒体定时器中编译时他就提示我参数不够,唉 那我用你得方法这个会得到解决么 是不是可以直接将ontimer里的代码复制进去就可以啦? 还有我不太明白你得MMTimerHandler(UINT nIDEvent)函数里的 nIDEvent这个参数有什么用呢? 怎么用呢
BeanJoy 2013-07-17
  • 打赏
  • 举报
回复
引用 22 楼 hu83369766 的回复:
[quote=引用 4 楼 BeanJoy 的回复:] [quote=引用 2 楼 VCAlice 的回复:] 1我程序里另外一个编辑框用的就是SetTimer。 2TimeProc不设置为对话框类的静态函数的话,程序就会出错。现在的错误只是a没有声明。我不知道怎么声明全局变量。
报什么错?报错就解决。我还想知道a是什么东西?你贴出的代码中可没有工。 windows下定时器,参考Timers Tutorial 代码如下:

void CTimersDlg::OnButtonBegin()
{
	.
	.
	.
    // Set resolution to the minimum supported by the system

    TIMECAPS tc;
    timeGetDevCaps(&tc, sizeof(TIMECAPS));
    m_uResolution = min(max(tc.wPeriodMin, 0), tc.wPeriodMax);
    timeBeginPeriod(resolution);

    // create the timer

    m_idEvent = timeSetEvent(
        m_elTime,
        resolution,
        TimerFunction,
        (DWORD)this,
        TIME_PERIODIC);
}

void CTimersDlg::OnButtonStop()
{
    // destroy the timer
    timeKillEvent(m_idEvent);

    // reset the timer
    timeEndPeriod (m_uResolution);
}

void CTimersDlg::MMTimerHandler(UINT nIDEvent) // called every elTime milliseconds
{
// do what you want to do, but quickly
	.
	.
	.
}

void CALLBACK TimerFunction(UINT wTimerID, UINT msg,
    DWORD dwUser, DWORD dw1, DWORD dw2)
    {
    // This is used only to call MMTimerHandler

    // Typically, this function is static member of CTimersDlg

    CTimersDlg* obj = (CTimersDlg*) dwUser;
    obj->MMTimerHandler(wTimerID);
    }
看到没?TimerFunction是回调函数,在其中再调用对话框的MMTimerHandler,而不是把对话框类的静态成员函数设置为回调。[/quote] 回调函数里再调用对话框类的一个函数 和直接在回调函数里实现相应功能 有什么区别呢 比如说我想在对话框中显示一些东西 若直接在全局的回调函数里实现,则还需要传递对话框句柄什么的 现在用你这个方法是不是就不需要了呢?[/quote] 两者最大的区别在于,在对话框类的函数里,可以使用对话框类的成员变量,而在回调函数中,如果没有对话框类的指针,你是无法使用对话框类的成员变量。
人见人厌 2013-07-17
  • 打赏
  • 举报
回复
引用 4 楼 BeanJoy 的回复:
[quote=引用 2 楼 VCAlice 的回复:] 1我程序里另外一个编辑框用的就是SetTimer。 2TimeProc不设置为对话框类的静态函数的话,程序就会出错。现在的错误只是a没有声明。我不知道怎么声明全局变量。
报什么错?报错就解决。我还想知道a是什么东西?你贴出的代码中可没有工。 windows下定时器,参考Timers Tutorial 代码如下:

void CTimersDlg::OnButtonBegin()
{
	.
	.
	.
    // Set resolution to the minimum supported by the system

    TIMECAPS tc;
    timeGetDevCaps(&tc, sizeof(TIMECAPS));
    m_uResolution = min(max(tc.wPeriodMin, 0), tc.wPeriodMax);
    timeBeginPeriod(resolution);

    // create the timer

    m_idEvent = timeSetEvent(
        m_elTime,
        resolution,
        TimerFunction,
        (DWORD)this,
        TIME_PERIODIC);
}

void CTimersDlg::OnButtonStop()
{
    // destroy the timer
    timeKillEvent(m_idEvent);

    // reset the timer
    timeEndPeriod (m_uResolution);
}

void CTimersDlg::MMTimerHandler(UINT nIDEvent) // called every elTime milliseconds
{
// do what you want to do, but quickly
	.
	.
	.
}

void CALLBACK TimerFunction(UINT wTimerID, UINT msg,
    DWORD dwUser, DWORD dw1, DWORD dw2)
    {
    // This is used only to call MMTimerHandler

    // Typically, this function is static member of CTimersDlg

    CTimersDlg* obj = (CTimersDlg*) dwUser;
    obj->MMTimerHandler(wTimerID);
    }
看到没?TimerFunction是回调函数,在其中再调用对话框的MMTimerHandler,而不是把对话框类的静态成员函数设置为回调。[/quote] 回调函数里再调用对话框类的一个函数 和直接在回调函数里实现相应功能 有什么区别呢 比如说我想在对话框中显示一些东西 若直接在全局的回调函数里实现,则还需要传递对话框句柄什么的 现在用你这个方法是不是就不需要了呢?
BeanJoy 2013-01-13
  • 打赏
  • 举报
回复
引用 17 楼 VCAlice 的回复:
程序这样写以后,居然可以运行了! 1只是发现点击结束定时按钮再点开始定时按钮时多媒体计时器显示的那个编辑框里的数字跳变到一个和前面不连续的数字继续增加,是不是点结束按钮以后,仍在计时呢? 2多媒体定时的那个编辑框的数字比SetTimer定时的那个编辑框里的数字要大,而且差距越拉越大。 int a; void CMYDlg::OnTimer(UINT nIDEv……
这很正常啊! 你用了两个定时器,一个OnTimmer,一个timeSetEvent。两个定时器设置的间隔时间是否一样?即使一样,也是有误差的,并非数字都相同。 另外,我还真想借用赵老师的话了,F5、F10、F11什么的。
schlafenhamster 2013-01-12
  • 打赏
  • 举报
回复
Header: Declared in mmsystem.h. Import Library: Use winmm.lib. MMRESULT timeSetEvent( UINT uDelay, UINT uResolution, LPTIMECALLBACK lpTimeProc, DWORD dwUser, UINT fuEvent );
VCAlice 2013-01-12
  • 打赏
  • 举报
回复
引用 4 楼 BeanJoy 的回复:
引用 2 楼 VCAlice 的回复: 1我程序里另外一个编辑框用的就是SetTimer。 2TimeProc不设置为对话框类的静态函数的话,程序就会出错。现在的错误只是a没有声明。我不知道怎么声明全局变量。 报什么错?报错就解决。我还想知道a是什么东西?你贴出的代码中可没有工。 windows下定时器,参考Timers Tutorial 代码如下: C/C++ code ?……
我按照你的程序改写了以后,出错说m_uResolution ,resolution undeclared identifier
VCAlice 2013-01-12
  • 打赏
  • 举报
回复
引用 4 楼 BeanJoy 的回复:
引用 2 楼 VCAlice 的回复: 1我程序里另外一个编辑框用的就是SetTimer。 2TimeProc不设置为对话框类的静态函数的话,程序就会出错。现在的错误只是a没有声明。我不知道怎么声明全局变量。 报什么错?报错就解决。我还想知道a是什么东西?你贴出的代码中可没有工。 windows下定时器,参考Timers Tutorial 代码如下: C/C++ code ?……
麻烦你可否把这个程序的完整代码发给我,我想看下我到底遗漏了什么东西,编译已经没有错了,但是运行时总是出现Dug Assertion Failed!
BeanJoy 2013-01-11
  • 打赏
  • 举报
回复
好好体会我5楼帖的代码,其中TimerFunction的定义放在OnButtonBegin前面。
VCAlice 2013-01-11
  • 打赏
  • 举报
回复
引用 8 楼 VisualEleven 的回复:
a是个啥类型的变量???
写错了,没有a这个变量,只有m_Cal这个变量,想通过定时器在编辑框中显示一个不断增加的数字。
Eleven 2013-01-11
  • 打赏
  • 举报
回复
a是个啥类型的变量???
VCAlice 2013-01-11
  • 打赏
  • 举报
回复
引用 5 楼 Li_Carey 的回复:
引用 2 楼 VCAlice 的回复: 1我程序里另外一个编辑框用的就是SetTimer。 2TimeProc不设置为对话框类的静态函数的话,程序就会出错。现在的错误只是a没有声明。我不知道怎么声明全局变量。 在CPP文件中回调函数要在这个函数前面 void CTimerSampleDlg::OnButtonstarttimer() { TimerID = timeSetEv……
试过了,也一样不行呢。
VCAlice 2013-01-11
  • 打赏
  • 举报
回复
[quote=引用 4 楼 BeanJoy 的回复:] 引用 2 楼 VCAlice 的回复: 1我程序里另外一个编辑框用的就是SetTimer。 2TimeProc不设置为对话框类的静态函数的话,程序就会出错。现在的错误只是a没有声明。我不知道怎么声明全局变量。 报什么错?报错就解决。我还想知道a是什么东西?你贴出的代码中可没有工。 报错如下 error C2664: 'timeSetEvent' : cannot convert parameter 3 from 'void..... 另外一个就是m_Cal undeclared identifier。(没有a,上面的写错了)
VCAlice 2013-01-11
  • 打赏
  • 举报
回复
程序这样写以后,居然可以运行了! 1只是发现点击结束定时按钮再点开始定时按钮时多媒体计时器显示的那个编辑框里的数字跳变到一个和前面不连续的数字继续增加,是不是点结束按钮以后,仍在计时呢? 2多媒体定时的那个编辑框的数字比SetTimer定时的那个编辑框里的数字要大,而且差距越拉越大。 int a; void CMYDlg::OnTimer(UINT nIDEvent) { // TODO: Add your message handler code here and/or call default m_Edit+=1; m_Cal=a; UpdateData(FALSE); CDialog::OnTimer(nIDEvent); } void CALLBACK CMYDlg::TimeProc(UINT uID,UINT uMsg,DWORD dwUser,DWORD dw1,DWORD dw2) { a=a+1; }
BeanJoy 2013-01-11
  • 打赏
  • 举报
回复
引用 14 楼 VCAlice 的回复:
引用 10 楼 BeanJoy 的回复:好好体会我5楼帖的代码,其中TimerFunction的定义放在OnButtonBegin前面。 我不明白,你那个程序是怎么能实现编辑框的数据不断增加的。

void CALLBACK TimerFunction(UINT wTimerID, UINT msg,
    DWORD dwUser, DWORD dw1, DWORD dw2)
    {
    // This is used only to call MMTimerHandler
 
    // Typically, this function is static member of CTimersDlg
 
    CTimersDlg* obj = (CTimersDlg*) dwUser;
    obj->MMTimerHandler(wTimerID);
    
}
你没看代码吗? 定时到了后,系统会自动调用TimerFunction,在这个函数中,可以得到对话框指针,然后调用对话框函数的MMTimerHandler。
VCAlice 2013-01-11
  • 打赏
  • 举报
回复
引用 11 楼 schlafenhamster 的回复:
“error C2664: 'timeSetEvent' : cannot convert parameter 3 from 'void.....” (LPTIMECALBACK)TimeProc
这个错误不知道如何解决
VCAlice 2013-01-11
  • 打赏
  • 举报
回复
引用 10 楼 BeanJoy 的回复:
好好体会我5楼帖的代码,其中TimerFunction的定义放在OnButtonBegin前面。
我不明白,你那个程序是怎么能实现编辑框的数据不断增加的。
  • 打赏
  • 举报
回复
多媒体定时器不会在到达时间后给你发消息的 你只能在一个类里建一个static函数或干脆就弄一个全局函数 然后判断这一时刻和上一时刻的计时差 比如: while(1) { if(presentTime - previousTime >100) yourFun(); } 精度太高了可是非常吃cpu的
长尾巴的悟空 2013-01-11
  • 打赏
  • 举报
回复
全局变量在 {} 外定义都可以。
schlafenhamster 2013-01-11
  • 打赏
  • 举报
回复
“error C2664: 'timeSetEvent' : cannot convert parameter 3 from 'void.....” (LPTIMECALBACK)TimeProc
加载更多回复(5)

16,472

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧