多媒体定时器和回调函数的问题,急!!

jiangerlai 2005-11-17 05:00:33
写了一个程序,要求定时精确到ms,所以选择了多媒体定时器。打算定时弹出窗口,但是自定义的窗口类在回调函数中无法使用,又不想通过消息传递实现,因为消息传递需要时间也会增加误差,各位有什么方法?急等!!!

//设置定时器代码如下
TimerID_1ms = timeSetEvent(m_iDuration, m_iwAccuracy,
LPTIMECALLBACK) OneMilliSecondProc,
(DWORD)this,TIME_ONESHOT);


//回调函数代码如下
void PASCAL OneMilliSecondProc(UINT wTimerID, UINT msg,DWORD dwUser,DWORD dwl,DWORD dw2)
{
CDlgSelect dlgSelect;

if(dlgSelect.DoModal()==IDOK)
{
//省略
}

}
...全文
718 19 打赏 收藏 转发到动态 举报
写回复
用AI写文章
19 条回复
切换为时间正序
请发表友善的回复…
发表回复
jiangerlai 2005-11-27
  • 打赏
  • 举报
回复
谢谢各位的回答,问题已经基本解决了。
我改用了 QueryPerformanceFrequency和 QueryPerformanceCounter,去掉了消息机制通过循环定时。另外,我将频繁domodal模式对话框改成了控制非模式对话框的显示和隐藏。现在已经基本上达到我的要求了。
stars_0913 2005-11-25
  • 打赏
  • 举报
回复
总体上,windows不是一个实时系统,你的ms级要求很本无法满足.
除非机器超级快并且只有你的应用程序运行,才可以用消息队列,否则只能写一个驱动程序,通过pc精确的时钟中断请求回调你的处理函数.呵呵,后一个方案好难的.
Winner25 2005-11-25
  • 打赏
  • 举报
回复
楼主,不知道你是做什么实验,你需要的这种实行环境能给说一下吗?否则不好回答!
1。程序变慢,可能是你要处理的数据 随时间 增加,也可能是memory leak
2。其实你可以这样做,如果要保存数据,你可以在main program 启动是分配一大块memory 做缓冲,可以利用一些高效的结构与算法来存取
3。显示可以按照一定的时间规律来处理,比如1s 更新一下,这样能平衡一下负载
4。在你的多媒体定时器里只做与实行处理相关的操作(充分必要的动作)
5。定好用一些rtos来做这种要求很高的实验

6。最期望的还是楼主能够把你现在的实验与环境说清楚一下

最后问一下,楼主学什么的呢?在哪儿上学?
jiangerlai 2005-11-25
  • 打赏
  • 举报
回复
谢谢各位的回答。我的程序允许有一定的误差。现在没有时间研究驱动程序。只想能不能尽量把定时做的准确。现在程序刚开始运行的时候能够达到我的要求,执行一段时间以后就达不到了,我的程序的每一个循环都要占用和释放内存来处理图片,可以肯定每一次使用内存之后都释放了。是不是这样做造成的程序越来越慢呢?有什么解决方法?
jiangerlai 2005-11-24
  • 打赏
  • 举报
回复
我是要用来做实验,测与人相关的数据,所以要求定时尽量准确。我现在用在回调函数里发消息的方法显示窗口,程序刚开始运行的时候还好,定时很准确,100ms和50ms差别很大,但程序运行了一段时间后就变得误差很大,定时100ms和50ms没什么差别。我已经在程序中把程序的优先级设成最高的了。

Winner25和其他高手能告诉我是可能是什么原因造成的么?给点建议,急啊!!
jiangerlai 2005-11-24
  • 打赏
  • 举报
回复
不是,如果那样,程序占用的内存应该增加。而且程序运行或者结束时通常会出错。
Stefine 2005-11-24
  • 打赏
  • 举报
回复
不会是有内存泄漏吧

一些简单的堆内存没有释放的问题,

这么东东应该早注意到了吧



jiangerlai 2005-11-24
  • 打赏
  • 举报
回复
是的,我把程序优先级设为最高,通过任务管理器察看,程序开始时,在弹出对话框之前机器cpu使用率20%左右,程序占用内存15兆左右。随程序的运行,程序变得越来越慢,在弹出对话框之前cpu利用率上升到30%到40%。占用内存减少到10兆一下。当程序关闭时,机器硬盘有声音,好像是在从虚拟内存读数据。

有什么方法解决这个程序运行越来越慢的问题么?拜托
oyljerry 2005-11-24
  • 打赏
  • 举报
回复
可能消息处理有了延时
系统负荷是不是比较大
jiangerlai 2005-11-24
  • 打赏
  • 举报
回复
好像从发出消息到弹出窗口之间的时间随程序运行越来越长了。大家有什么好的建议么?
jiangerlai 2005-11-24
  • 打赏
  • 举报
回复
程序的流程是这样的:

处理

——显示问题,设置定时器(ONE_SHOT)

——回调函数中取消定时器,发送消息

——消息处理函数中弹出窗口接收用户输入

——下一次处理

——显示问题,设置定时器

。。。。依此循环
Winner25 2005-11-18
  • 打赏
  • 举报
回复
晕,我说的堵塞是指你堵塞timesetevent中所指定的回调函数的线程,你就不能在这个函数里做这些事,除了PostMessage, timeGetSystemTime, timeGetTime, timeSetEvent, timeKillEvent, midiOutShortMsg, midiOutLongMsg, and OutputDebugString.
而且我觉得你这个解决方案里有个矛盾:
1。显示窗口中间也要处理消息来创建和显示
2。你人的反映是非实时的,为什么非要在精确的时间里来给你通过显示来提示呢?
3。你完全可以在timesetevent里做控制,后发消息来控制窗口创建
jiangerlai 2005-11-18
  • 打赏
  • 举报
回复
有没有办法可以绕过这个限制,我用的是TIME_ONESHOT,只执行一次,所以弹出窗口不会影响引起堵塞。问题就是如何在它的线程上下文中使用我的窗口???
Winner25 2005-11-17
  • 打赏
  • 举报
回复
timeSetEvent,是别的线程上下文,而且文档明确告你了不能调用这些函数,你还更来个domodal堵塞,哈哈
DentistryDoctor 2005-11-17
  • 打赏
  • 举报
回复
用消息即可,如果系统不忙,发送消息到被处理的时间响应可以忽略。
jiangerlai 2005-11-17
  • 打赏
  • 举报
回复
顺便问下,windows程序从发出消息到消息被处理大概需要多少时间?
jiangerlai 2005-11-17
  • 打赏
  • 举报
回复
对,类的hWnd为0x00000000。无效。domodal的时候出错
rageliu 2005-11-17
  • 打赏
  • 举报
回复
CDlgSelect dlgSelect;

if(dlgSelect.DoModal()==IDOK)
{
//省略
}

这里不能使用???
菜牛 2005-11-17
  • 打赏
  • 举报
回复
“但是自定义的窗口类在回调函数中无法使用”


++++++++++++++++
怎么个不能用法?是不是没有包含头文件?

16,472

社区成员

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

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

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