在回调函数里不能使用domodal
来源:互联网 发布:windows ftp put命令 编辑:程序博客网 时间:2024/05/21 09:52
http://topic.csdn.net/t/20051117/17/4400541.html
多媒体定时器和回调函数的问题,急!!
写了一个
//设置定时器代码如下
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)
{
//省略
}
}
1 楼Mackz(在相互)回复于 2005-11-17 18:10:20 得分 0
“但是自定义的窗口类在回调函数中无法使用”
++++++++++++++++
怎么个不能用法?是不是没有包含头文件?Top
2 楼rageliu(天气好了就去长白山看水怪去了,嘿嘿...)回复于 2005-11-17 18:53:37 得分 5
CDlgSelect dlgSelect;
if(dlgSelect.DoModal()==IDOK)
{
//省略
}
这里不能使用???Top
3 楼jiangerlai(二来)回复于 2005-11-17 20:15:07 得分 0
对,类的hWnd为0x00000000。无效。domodal的时候出错Top
4 楼jiangerlai(二来)回复于 2005-11-17 21:52:12 得分 0
顺便问下,windows程序从发出消息到消息被处理大概需要多少时间?Top
5 楼DentistryDoctor(不在无聊中无奈,就在沉默中变态)回复于 2005-11-17 22:08:41 得分 0
用消息即可,如果系统不忙,发送消息到被处理的时间响应可以忽略。Top
6 楼Winner25(帮忙关注一下www.jjlsoft.com/elong)回复于 2005-11-17 22:49:45 得分 50
timeSetEvent,是别的线程上下文,而且文档明确告你了不能调用这些函数,你还更来个domodal堵塞,哈哈Top
7 楼jiangerlai(二来)回复于 2005-11-18 08:57:48 得分 0
有没有办法可以绕过这个限制,我用的是TIME_ONESHOT,只执行一次,所以弹出窗口不会影响引起堵塞。问题就是如何在它的线程上下文中使用我的窗口???Top
8 楼Winner25(帮忙关注一下www.jjlsoft.com/elong)回复于 2005-11-18 12:05:23 得分 0
晕,我说的堵塞是指你堵塞timesetevent中所指定的回调函数的线程,你就不能在这个函数里做这些事,除了PostMessage, timeGetSystemTime, timeGetTime, timeSetEvent, timeKillEvent, midiOutShortMsg, midiOutLongMsg, and OutputDebugString.
而且我觉得你这个解决方案里有个矛盾:
1。显示窗口中间也要处理消息来创建和显示
2。你人的反映是非实时的,为什么非要在精确的时间里来给你通过显示来提示呢?
3。你完全可以在timesetevent里做控制,后发消息来控制窗口创建Top
9 楼jiangerlai(二来)回复于 2005-11-24 12:48:40 得分 0
我是要用来做实验,测与人相关的数据,所以要求定时尽量准确。我现在用在回调函数里发消息的方法显示窗口,程序刚开始运行的时候还好,定时很准确,100ms和50ms差别很大,但程序运行了一段时间后就变得误差很大,定时100ms和50ms没什么差别。我已经在程序中把程序的优先级设成最高的了。
Winner25和其他高手能告诉我是可能是什么原因造成的么?给点建议,急啊!!Top
10 楼jiangerlai(二来)回复于 2005-11-24 13:42:44 得分 0
程序的流程是这样的:
处理
——显示问题,设置定时器(ONE_SHOT)
——回调函数中取消定时器,发送消息
——消息处理函数中弹出窗口接收用户输入
——下一次处理
——显示问题,设置定时器
。。。。依此循环Top
11 楼jiangerlai(二来)回复于 2005-11-24 15:43:17 得分 0
好像从发出消息到弹出窗口之间的时间随程序运行越来越长了。大家有什么好的建议么?Top
12 楼oyljerry(【勇敢的心】→ ㊣提拉米苏√㊣)回复于 2005-11-24 17:12:54 得分 25
可能消息处理有了延时
系统负荷是不是比较大Top
13 楼jiangerlai(二来)回复于 2005-11-24 21:16:06 得分 0
是的,我把程序优先级设为最高,通过任务管理器察看,程序开始时,在弹出对话框之前机器cpu使用率20%左右,程序占用内存15兆左右。随程序的运行,程序变得越来越慢,在弹出对话框之前cpu利用率上升到30%到40%。占用内存减少到10兆一下。当程序关闭时,机器硬盘有声音,好像是在从虚拟内存读数据。
有什么方法解决这个程序运行越来越慢的问题么?拜托Top
14 楼Stefine(CSDN最菜滴猩猩)回复于 2005-11-24 21:41:02 得分 0
不会是有内存泄漏吧
一些简单的堆内存没有释放的问题,
这么东东应该早注意到了吧
Top
15 楼jiangerlai(二来)回复于 2005-11-24 22:16:43 得分 0
不是,如果那样,程序占用的内存应该增加。而且程序运行或者结束时通常会出错。Top
16 楼stars_0913()回复于 2005-11-25 00:18:21 得分 20
总体上,windows不是一个实时系统,你的ms级要求很本无法满足.
除非机器超级快并且只有你的应用程序运行,才可以用消息队列,否则只能写一个驱动程序,通过pc精确的时钟中断请求回调你的处理函数.呵呵,后一个方案好难的.
Top
17 楼jiangerlai(二来)回复于 2005-11-25 09:07:47 得分 0
谢谢各位的回答。我的程序允许有一定的误差。现在没有时间研究驱动程序。只想能不能尽量把定时做的准确。现在程序刚开始运行的时候能够达到我的要求,执行一段时间以后就达不到了,我的程序的每一个循环都要占用和释放内存来处理图片,可以肯定每一次使用内存之后都释放了。是不是这样做造成的程序越来越慢呢?有什么解决方法?Top
18 楼Winner25(帮忙关注一下www.jjlsoft.com/elong)回复于 2005-11-25 22:47:19 得分 0
楼主,不知道你是做什么实验,你需要的这种实行环境能给说一下吗?否则不好回答!
1。程序变慢,可能是你要处理的数据 随时间 增加,也可能是memory leak
2。其实你可以这样做,如果要保存数据,你可以在main program 启动是分配一大块memory 做缓冲,可以利用一些高效的结构与算法来存取
3。显示可以按照一定的时间规律来处理,比如1s 更新一下,这样能平衡一下负载
4。在你的多媒体
5。定好用一些rtos来做这种要求很高的实验
6。最期望的还是楼主能够把你现在的实验与环境说清楚一下
最后问一下,楼主学什么的呢?在哪儿上学?Top
19 楼jiangerlai(二来)回复于 2005-11-27 21:50:17 得分 0
谢谢各位的回答,问题已经基本解决了。
我改用了 QueryPerformanceFrequency和 QueryPerformanceCounter,去掉了消息机制通过循环定时。另外,我将频繁domodal模式对话框改成了控制非模式对话框的显示和隐藏。现在已经基本上达到我的要求了。
- 在回调函数里不能使用domodal
- cocos2dx 在button回调函数里removeFromParent崩溃
- 回调函数在MFC中的使用
- 在 SQLite3 中使用回调函数
- 在 SQLite3 中使用回调函数
- 在 SQLite3 中使用回调函数
- 回调函数在android中的使用
- 在 SQLite3 中使用回调函数
- 关于回调函数里的控件使用问题
- 使用回调函数
- 回调函数使用
- 什么是回调函数?回调函数适合在什么情况下使用?
- cocosBuilder里添加callback回调函数
- ajax不能调用回调函数
- ajax不能调用回调函数
- ajax回调函数不能赋值
- 在C#中使用API回调函数的方法
- 回调函数及其在C语言中的使用
- 学习求组合数的算法
- 题目
- 基于uClinux的Web Server的实现
- 我的j2ee学习计划
- 经典软件开发阶段的关键问题
- 在回调函数里不能使用domodal
- C++学习笔记(六)
- MyChemicalRomance
- Tucany SCA软件架构设计理念分析鉴赏 (一)
- 总结总结...
- 如何配置uClinux实现简易HTTP应用(显示web网页)
- MyEclipse+MySql
- Hibernate
- 关于工作、关于学习、关于培训