日期:2014-05-20  浏览次数:20688 次

关于数据采集的问题
标题不是很贴切!
程序是这样的:
一个线程负责从串口实时采集数据,得到数据后通过委托调用主线程中接口,通知数据来到,主线程中该接口(函数)处理得到的数据!
数据采集每秒25次,每次30个字节!
数据处理函数要进行数据的实时显示,曲线实时绘制,系统的状态检测等工作!

现在问题是这样的:
1.如果状态检测检测出报警信息,根据设计要弹出对话框(我用的是system.windows.form.messagebox.show),但当对话框弹出后,好像数据处理的那个函数就不工作了,结果点击报警消息确定后系统就挂了。
2.调试时,如果数据正在采集,当从调试切换到运行状态(F5)后,系统又挂了!

个人觉得可能是由于数据采集比较“娇气”,当有其它操作打断它的进行(就是主线程接受处理函数),它就不干了,呵呵!

请大家帮忙指点一下,看看该如何解决!可贴出代码供分析!

------解决方案--------------------
"系统又挂了 ",lz,你是指采集停止,还是主程序退出????
------解决方案--------------------
线程控制问题
------解决方案--------------------
采集程序如果出现异常,建议还是写日志的好...
------解决方案--------------------
system.windows.form.messagebox.show
改成,自己写个报警的form1,再来调用form1.show();
这样主系统就暂停了
------解决方案--------------------
http://community.csdn.net/Expert/topic/5328/5328577.xml?temp=.4497949
------解决方案--------------------
http://community.csdn.net/Expert/topic/5334/5334624.xml?temp=.2989313
上面这个人和你问的很像

除了SendMessage我没试之外别的都试过了,明确的告诉楼主,只要在工作线程显示模态窗口就会阻塞线程(包括回调和自定义事件),线程就会停在那里不做别的事了;
如果非模态的话窗口倒是没关系;
------解决方案--------------------
SendMessage也没用的,也是同步的,用PostMessage是异步的,发送消息到主线程,让主线程去弹出对话框,自己继续采集
------解决方案--------------------
采集数据的那个线程,设置为高优先级线程,让委托作为唯一对外接口,messagebox好像可以弹出多个的吧
------解决方案--------------------

感觉楼主线程设计上有点问题
给个设计建议

设定一个循环缓冲区Buf
采集线程B从串口采集数据,写入缓冲区
主线程A从缓冲区Buf读取数据,处理、显示、检测(不要显示Dialog如果非要显示Dialog,再开线程C)
也就是A、B线程都不能被阻塞

这里牵扯到缓冲区读写并发问题,一般操作系统的书籍中都能找到