如何实时处理消息?(消息队列中的消息可能暂时被挂起得不到实时处理)

sxslyy 2005-12-20 06:06:32
情况是:自定义了一个消息,在DLL中向主进程发送这个消息,可是一旦计算机的CPU被某个进程占用,或系统资源紧张时,发送到消息队列中的消息就暂时被挂起,得不到实时处理消息.(不能实时处理就可能损失数据).请问有可能解决吗?
...全文
827 30 打赏 收藏 转发到动态 举报
写回复
用AI写文章
30 条回复
切换为时间正序
请发表友善的回复…
发表回复
一个傻冒 2005-12-23
  • 打赏
  • 举报
回复
我也同意A_Qiao() 的思路.就如TCP/IP在处理不同速度机器一样应该把数据缓存起来然后分阶段来处理这样不会丢数据.
rageliu 2005-12-23
  • 打赏
  • 举报
回复
看来还是没有理想的办法,楼主现在是怎么做的?继续关注
SeekTruth 2005-12-23
  • 打赏
  • 举报
回复
sxslyy(孤松傲雪):
我的意思是不依赖于Windows的消息机制,直接使用自己定义的接口进行交互.
sxslyy 2005-12-23
  • 打赏
  • 举报
回复
哎!把兄弟的贴子给客户看了!最终同意用缓冲池缓冲一下.同时我将线程的优先级提高到15.现在效果很好,我正在测试运行中!综上分析,我想windows要完全实时应该是没有好办法.如要求那么严我想要实时嵌入式系统才能做到了.
ghyd 2005-12-22
  • 打赏
  • 举报
回复
除非客户的操作系统只运行你的程序,否则,如果运行其他的程序,就有可能超出楼主要求的10ms的时间限制.象这样的任务,只能在实时系统里实现.
  如果你的硬件能在每10ms之后触发一个中断,然后你在一个优先级为实时的线程中守侯这个事件,然后尽量用最有效率的代码处理完你的数据.  这样的话似乎还可以.
   总之,如果想完满的完成这个任务,没有硬件的参与,是不可能的.
sxslyy 2005-12-22
  • 打赏
  • 举报
回复
谢谢各位兄弟!我先试试大家的方法!谁还有高招请继续!
rageliu 2005-12-22
  • 打赏
  • 举报
回复
1. 提高线程的优先级(不过应该还是有楼主说的情况发生,因为线程本身可能使资源紧张)
2. 既然可以发送消息,通过系统回调来处理数据. 那为什么不直接调用主进程里面的函数?不用
系统回调的方式

觉得中和12的处理会比较理想一些:直接调用主进程的函数,不用系统回调,将处理单独开启一个线程,提高其优先级
皮皮鲁 2005-12-22
  • 打赏
  • 举报
回复
虽然做不到完全实时,但是提高线程优先级的话,还是可以得到很快的处理,一般来说解决你的问题应该不使问题,除非你的线程运行时还有其它比你的线程优先级更高的线程。

如果你将线程优先级设为实时,那么这种机率几乎没有,所以不用担心哈
sxslyy 2005-12-22
  • 打赏
  • 举报
回复
哎!我想也是不可能,因为windows这样的非实时系统,要完全实时太难了,而且设备还是主动发动数据,我只能被动接收,也不让我控制设备.还不允许我将发送来的数据缓存一下.如不能缓存一下,我再怎么完善程序,我也控制不了windows呀!
请各位兄弟,再想想有没有什么高招!要是不行的话,还要被客户骂无能了!

cici2006 2005-12-22
  • 打赏
  • 举报
回复
同意杀了所有进程。呵。想玩都不能玩了。哈哈。
czg516 2005-12-22
  • 打赏
  • 举报
回复
windouws做为消息系统,它不是适时的,你无法保证别个线程在某一个时间内和你抢占cpu,
所以楼上的大哥门说的很清楚了,只能减小数据遗失的几率,不能够避免.
提高自己程序的算法和提高主线程的优先级是比较理想的算法.
sxslyy 2005-12-22
  • 打赏
  • 举报
回复
lzzqqq(Jonersen) 兄:REALTIME级太高了,它不安时间片来轮转,很容易当机的.
SeekTruth(鹤舞白沙)兄:能不能再具体点,用回调,函数指针怎么能做到实时.
SeekTruth 2005-12-22
  • 打赏
  • 举报
回复
回调,函数指针都行
lzzqqq 2005-12-22
  • 打赏
  • 举报
回复
除非把你主线程的等级设为REALTIME
sxslyy 2005-12-22
  • 打赏
  • 举报
回复
哈哈!谢谢各位兄弟!现在我对windows系统能不能完成这样的要求很是怀疑!主要是客户认为可以实现!说不行他们不信,只好请教兄弟们,看看还有没有高招!
wuchi 2005-12-22
  • 打赏
  • 举报
回复
10毫秒太久,只争朝夕
rageliu 2005-12-22
  • 打赏
  • 举报
回复
哈哈!!这下可能就不太好提高了...

1. 如果数据处理是并行的, 将数据处理再分为多个线程最后会总试试(不过这样可能要处理同
步什么的就可能更慢)
2. 启动另一个线程,见到别的程序就给我kill

关注...
holyeagle 2005-12-22
  • 打赏
  • 举报
回复
如LZ所说,Windows不是实时操作系统,所以就没有办法用消息的方法进行实时通讯了.

按照lz的要求,应该有两个问题要解决:
1.DLL收到数据如何实时或者非常短的时间内通知处理线程.
2.线程得到消息以后如何在规定时间内完成数据处理.

第一个问题在于如果用户在发消息或者调用(也可以线程同步)的时候,突然cpu被抢占,就会无法在规定的时间内完成操作.
第二个问题也一样,即使线程已经开始处理,但是cpu被抢站,还是达不到用户的要求.

如果想完全独占cpu,除非你去改写windows的线程管理方式和cpu时间片的管理,因为即使把线程的优先级设为了THREAD_PRIORITY_HIGHEST乃至于THREAD_PRIORITY_TIME_CRITICAL,别的程序一样可以阻塞你,或者系统本身就忙.所以,如果要求不是很bt,比如用户的环境很简单,就只有一个运行程序,可以尝试提高线程优先级,优化算法,提高效率来解决.

其实个人觉得最好可以利用空间的方法去实现,用临时文件或者缓冲池对数据进行备份,最不理想的情况是,你连续20毫秒都没有cpu时间,没有办法保存收上来的数据.那你只好去写个驱动,保存数据了,如果这都不行,就说明连系统都不能保证可以数据的完整,你在上层怎么做, 那就真真真的莫办法来.呵呵.
sxslyy 2005-12-22
  • 打赏
  • 举报
回复
兄弟们!我发现出现了这种情况!比如我的函数要处理收上来的数据,正常情况在10毫秒内这个函数是可以运行完成的.可如果这时又运行其它程序(如:word...),就完了,我想是其它程序抢来CPU等资源使函数运行的用时超过了10毫秒(我已提高了线程的优级先级)
captainwh 2005-12-22
  • 打赏
  • 举报
回复
应该保证你的客户只在机器上运行这一个程序, 并且你调高下优先级

要是谁运行这个程序的时候开n个ie, 玩着几个游戏, 再来点音乐...
处理延迟是不可避免的

加载更多回复(10)

16,472

社区成员

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

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

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