我分析是多线程导致的问题,请问有什么方法避免这个问题?
时间: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就返回。
请大家帮我分析分析是否是因为这个导致丢数据?如果是该如何避免呢??
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毫秒,完全能处理完
楼主写一些日志,记录下各处理的时间,看在哪出了问题
有没有可能消息队列堵塞,造成100毫秒内并未处理完?
作者: ATMCash4423 发布时间: 2011-11-29
相关阅读 更多
热门阅读
-
office 2019专业增强版最新2021版激活秘钥/序列号/激活码推荐 附激活工具
阅读:74
-
如何安装mysql8.0
阅读:31
-
Word快速设置标题样式步骤详解
阅读:28
-
20+道必知必会的Vue面试题(附答案解析)
阅读:37
-
HTML如何制作表单
阅读:22
-
百词斩可以改天数吗?当然可以,4个步骤轻松修改天数!
阅读:31
-
ET文件格式和XLS格式文件之间如何转化?
阅读:24
-
react和vue的区别及优缺点是什么
阅读:121
-
支付宝人脸识别如何关闭?
阅读:21
-
腾讯微云怎么修改照片或视频备份路径?
阅读:28