标题不是很贴切!
程序是这样的:
一个线程负责从串口实时采集数据,得到数据后通过委托调用主线程中接口,通知数据来到,主线程中该接口(函数)处理得到的数据!
数据采集每秒25次,每次30个字节!
数据处理函数要进行数据的实时显示,曲线实时绘制,系统的状态检测等工作!现在问题是这样的:
1.如果状态检测检测出报警信息,根据设计要弹出对话框(我用的是system.windows.form.messagebox.show),但当对话框弹出后,好像数据处理的那个函数就不工作了,结果点击报警消息确定后系统就挂了。
2.调试时,如果数据正在采集,当从调试切换到运行状态(F5)后,系统又挂了!个人觉得可能是由于数据采集比较“娇气”,当有其它操作打断它的进行(就是主线程接受处理函数),它就不干了,呵呵!请大家帮忙指点一下,看看该如何解决!可贴出代码供分析!

解决方案 »

  1.   

    system.windows.form.messagebox.show
    改成,自己写个报警的form1,再来调用form1.show();
    这样主系统就暂停了
      

  2.   

    to sdl2005lyx() :“系统又挂了”指的是主程序退出了 !
    to qiri07(俺家金毛de地位比俺高) :该如何对线程进行控制?我现在基本没有对线程作什么处理!
    to liujia_0421(SnowLover):采集程序的日志如何写呢?怎样记录?在何处记录才能捕捉到问题呢?
    to wls12342004(青青子木) :我曾经写了一个FORM,但采用FORM.SHOW方法后,当时好像是不刷新了,我再试下!!
      

  3.   

    http://community.csdn.net/Expert/topic/5328/5328577.xml?temp=.4497949
      

  4.   

    lz:
       你用try{}catch{}模式,跟踪调试,看看问题出在什么地方,注意,断点要设置在catch所有的行号!!!
      

  5.   

    会有这种情况???你要把断点要设置在catch所有的行号!!!
      

  6.   

    http://community.csdn.net/Expert/topic/5334/5334624.xml?temp=.2989313
    上面这个人和你问的很像除了SendMessage我没试之外别的都试过了,明确的告诉楼主,只要在工作线程显示模态窗口就会阻塞线程(包括回调和自定义事件),线程就会停在那里不做别的事了;
    如果非模态的话窗口倒是没关系;
      

  7.   

    SendMessage也没用的,也是同步的,用PostMessage是异步的,发送消息到主线程,让主线程去弹出对话框,自己继续采集
      

  8.   

    我以前采用消息发送,SendMessage,自定义消息,在WndProc响应消息,可以采集,也可以弹出报警对话框!但数据采集线程还是很容易被打断,比如说我设置断点调试,当从调试状态切换到运行时,系统就挂了,所以我后来采用委托(也是为了整体看起来都没有调用“不安全”代码原故)来实现采集线程向主线程数据的传递!但就出现了我上面的问题!
    to zhaoyingqi(芹菜):我也想实现类似非模式对话框,但没找到实现的途径!
    to All:现在我加了一个定时器,定时检测状态!这样虽然可以弹出对话框并且主线程不挂,但又加了一个定时,性能差了些,而且与当初的设计背离!最重要的是,采集操作还是容易被打断,经常不知道原因的挂掉。现在采取的办法是,每当进行比较耗费时间的操作,比如存取数据库、打开文件对话框(这个我一直很纳闷,为什么我调用打开文件对话框系统经常会挂呢?这个操作不会那么复杂吧?它是系统的东西啊)等,我都是先把采集线程停掉,然后等待操作完成后再继续采集!该如何解决,请各位帮忙看看
      

  9.   

    采集数据的那个线程,设置为高优先级线程,让委托作为唯一对外接口,messagebox好像可以弹出多个的吧
      

  10.   


    感觉楼主线程设计上有点问题
    给个设计建议设定一个循环缓冲区Buf
    采集线程B从串口采集数据,写入缓冲区
    主线程A从缓冲区Buf读取数据,处理、显示、检测(不要显示Dialog如果非要显示Dialog,再开线程C)
    也就是A、B线程都不能被阻塞这里牵扯到缓冲区读写并发问题,一般操作系统的书籍中都能找到
      

  11.   

    to nnhy(大石头):修改过将采集线程设置为最高优先级!“让委托成为唯一的对外接口”是不是说线程采集到数据后就只调用委托向主线程传递数据,如果是的话,我现在就是如此,如果不是,那该如何来实现?
    to crossrowman(godi) :我现在没有设置循环缓冲区,有数据过来后,我直接调用主线程接收函数进行数据处理!调用机制采用委托实现,采集线程与主现成都没被组塞(呵呵,应该是)!不过再设置一个缓冲区是个好主意,我考虑下!