+ -
当前位置:首页 → 问答吧 → 我分析是多线程导致的问题,请问有什么方法避免这个问题?

我分析是多线程导致的问题,请问有什么方法避免这个问题?

时间:2011-11-29

来源:互联网

我有两个程序,client.exe和test.exe,他们使用copydata进行进程间通信。
test只给client发copydata消息,

client中有一个双向链表list用于缓冲数据,因为要把copydata接收来的数据存入数据库。
插入数据库慢,copydata快,所以必须有一个缓冲。

client启动时就开启了一个线程myThread,作用是从list尾开始读数据,如果list尾的上一个指针不是head,
则读出list中的数据并插入到数据库中。
主线程接收copydata后直接在list表头插入数据。

现在的问题是偶尔从test发来的数据会丢失。

我写了个日志文件来监视数据,我在3个地方进行了监视:
1是在主线程接收copydata后,插入list表头之前把数据存入日志。
2是在myThread线程读取之后,插入数据库操作之前把数据存入日志。
3是在myThread线程插入数据库之后把数据存入日志。

经过文件比较,发现三个文件的内容是一样的。那也就是说明test是发送了copydata,但是client的主线程
接收copydata的函数根本没有收到这个消息!

我怀疑是因为client程序在执行myThread时,因为主线程会暂停,导致偶尔会接收不到test发来的copydata消息!
test发消息的频率是100毫秒。
test发送消息的函数是:
::SendMessageTimeout(hWnd,WM_COPYDATA,(WPARAM)this->m_hWnd,(LPARAM)&cpd,SMTO_ABORTIFHUNG,1,NULL);
把发送消息的超时时间设置成了1毫秒,因为想进行异步,不用等client就返回。

请大家帮我分析分析是否是因为这个导致丢数据?如果是该如何避免呢??

作者: ATMCash4423   发布时间: 2011-11-29

进程间做个同步

作者: quwei197874   发布时间: 2011-11-29

WM_COPYDATA的问题 这个无法异步, 主线程不要暂停吧, 这样就避免这个问题
或者换个通讯方式, 比如管道

作者: zzz3265   发布时间: 2011-11-29

100毫秒,完全能处理完
楼主写一些日志,记录下各处理的时间,看在哪出了问题

作者: ouyh12345   发布时间: 2011-11-29

引用 3 楼 ouyh12345 的回复:
100毫秒,完全能处理完
楼主写一些日志,记录下各处理的时间,看在哪出了问题

有没有可能消息队列堵塞,造成100毫秒内并未处理完?

作者: ATMCash4423   发布时间: 2011-11-29