http://topic.csdn.net/t/20051117/17/4400541.html
写了一个程序,要求定时精确到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)
{
//省略
}
} 问题点数:100、回复次数:19Top
“但是自定义的窗口类在回调函数中无法使用”
++++++++++++++++
怎么个不能用法?是不是没有包含头文件?Top
CDlgSelect dlgSelect;
if(dlgSelect.DoModal()==IDOK)
{
//省略
}
这里不能使用???Top
对,类的hWnd为0x00000000。无效。domodal的时候出错Top
顺便问下,windows程序从发出消息到消息被处理大概需要多少时间?Top
用消息即可,如果系统不忙,发送消息到被处理的时间响应可以忽略。Top
timeSetEvent,是别的线程上下文,而且文档明确告你了不能调用这些函数,你还更来个domodal堵塞,哈哈Top
有没有办法可以绕过这个限制,我用的是TIME_ONESHOT,只执行一次,所以弹出窗口不会影响引起堵塞。问题就是如何在它的线程上下文中使用我的窗口???Top
晕,我说的堵塞是指你堵塞timesetevent中所指定的回调函数的线程,你就不能在这个函数里做这些事,除了PostMessage, timeGetSystemTime, timeGetTime, timeSetEvent, timeKillEvent, midiOutShortMsg, midiOutLongMsg, and OutputDebugString.
而且我觉得你这个解决方案里有个矛盾:
1。显示窗口中间也要处理消息来创建和显示
2。你人的反映是非实时的,为什么非要在精确的时间里来给你通过显示来提示呢?
3。你完全可以在timesetevent里做控制,后发消息来控制窗口创建Top
我是要用来做实验,测与人相关的数据,所以要求定时尽量准确。我现在用在回调函数里发消息的方法显示窗口,程序刚开始运行的时候还好,定时很准确,100ms和50ms差别很大,但程序运行了一段时间后就变得误差很大,定时100ms和50ms没什么差别。我已经在程序中把程序的优先级设成最高的了。
Winner25和其他高手能告诉我是可能是什么原因造成的么?给点建议,急啊!!Top
程序的流程是这样的:
处理
——显示问题,设置定时器(ONE_SHOT)
——回调函数中取消定时器,发送消息
——消息处理函数中弹出窗口接收用户输入
——下一次处理
——显示问题,设置定时器
。。。。依此循环Top
好像从发出消息到弹出窗口之间的时间随程序运行越来越长了。大家有什么好的建议么?Top
可能消息处理有了延时
系统负荷是不是比较大Top
是的,我把程序优先级设为最高,通过任务管理器察看,程序开始时,在弹出对话框之前机器cpu使用率20%左右,程序占用内存15兆左右。随程序的运行,程序变得越来越慢,在弹出对话框之前cpu利用率上升到30%到40%。占用内存减少到10兆一下。当程序关闭时,机器硬盘有声音,好像是在从虚拟内存读数据。
有什么方法解决这个程序运行越来越慢的问题么?拜托Top
不会是有内存泄漏吧
一些简单的堆内存没有释放的问题,
这么东东应该早注意到了吧
Top
不是,如果那样,程序占用的内存应该增加。而且程序运行或者结束时通常会出错。Top
总体上,windows不是一个实时系统,你的ms级要求很本无法满足.
除非机器超级快并且只有你的应用程序运行,才可以用消息队列,否则只能写一个驱动程序,通过pc精确的时钟中断请求回调你的处理函数.呵呵,后一个方案好难的.
Top
谢谢各位的回答。我的程序允许有一定的误差。现在没有时间研究驱动程序。只想能不能尽量把定时做的准确。现在程序刚开始运行的时候能够达到我的要求,执行一段时间以后就达不到了,我的程序的每一个循环都要占用和释放内存来处理图片,可以肯定每一次使用内存之后都释放了。是不是这样做造成的程序越来越慢呢?有什么解决方法?Top
楼主,不知道你是做什么实验,你需要的这种实行环境能给说一下吗?否则不好回答!
1。程序变慢,可能是你要处理的数据 随时间 增加,也可能是memory leak
2。其实你可以这样做,如果要保存数据,你可以在main program 启动是分配一大块memory 做缓冲,可以利用一些高效的结构与算法来存取
3。显示可以按照一定的时间规律来处理,比如1s 更新一下,这样能平衡一下负载
4。在你的多媒体定时器里只做与实行处理相关的操作(充分必要的动作)
5。定好用一些rtos来做这种要求很高的实验
6。最期望的还是楼主能够把你现在的实验与环境说清楚一下
最后问一下,楼主学什么的呢?在哪儿上学?Top
谢谢各位的回答,问题已经基本解决了。
我改用了 QueryPerformanceFrequency和 QueryPerformanceCounter,去掉了消息机制通过循环定时。另外,我将频繁domodal模式对话框改成了控制非模式对话框的显示和隐藏。现在已经基本上达到我的要求了。