两个软件之间如何进行数据交换? (200分)

  • 主题发起人 主题发起人 jeefong
  • 开始时间 开始时间
若事件发生频率相对稳定,处理速度足够快,用wm_copydata消息,简单又好记[^]

在很多情况下,可能不那么简单哦,比如程序A每过1分钟采集10笔数据,但这10笔可能是集中某1秒钟内完成的,而程序B每处理一笔数据要花1秒甚至更长时间。如何应付这种情况呢?
办法当然也有很多,其中一种就是用共享内存建立队列,程序A每采集一笔数据就加入队列并发个消息通知程序B,而程序B收到消息则顺序处理队列中的数据。程序B也可以在一个单独的线程中监视队列,也不用程序A发消息了。
 
[:D]完全搞不明白龙丹你在说什么。就算是发生频率不稳定,你依然需要写共享区吧?难道
写共享区花的时间会比写进程内内存少?不会吧?WM_COPYDATA一样也是将消息放入接收者
的消息队列中,又不会因为消息发生频繁就会消失。就算考虑SendMessage与PostMessage间
的区别,采集时可以通过缓冲技术来缓解冲突。再说,你是否需要考虑那个共享区设多大?
如果太频繁了会不会装不下?
用线程监视队列?如果没有消息或者内核对象来通知,那这个线程是不是不停地查阅队列?
CPU可就忙坏罗。
 
WM_CopyData有一点不好:只能用SendMessage来发送,而在某些情况下可能只允许用PostMessage。
而用内存映射文件在处理多个应用程序读写时要用互斥,也麻烦。
 
barton,你不要急嘛[:)],当你写“SendMessage与PostMessage间的区别...”的时候肯定已经明白我在说什么了。
建立队列正是缓冲手段啊,写内存的时间可以忽略(如果不能忽略可能需要专门设计了,WM_COPYDATA不也是使用共享内存吗,我猜的)。当然,缓冲也可以在接收端或发送端内部建立,但这会稍微多花一些时间。
至于说队列需要考虑大小、线程监视队列会让CPU忙坏了,兄弟,这些话不应该是从你说的啊。
 
呵呵,我听说WM_CopyData用的是Pipes,不知道是不是真的
 
要这么讨论,三天三夜也说不清楚,先用wm_copydata试一下,能满足就行了,不能满足的
话再用其他的办法也来得及,反正wm_copydata实现起来也非不了多少功夫
 
wm_copydata是挺好用的
 
To barton:
我考虑的采用Socket的部分是由于看到他说要把采集到的数据要由程序B向网络发送才提出的,而不是为了本机上的进程间通信而提出的。
 
多人接受答案了。
 
后退
顶部