问题描述
串口通信大致可分为发送线程、接收线程、数据解析线程,发送和接收线程暂不考虑,以下是我写的一个数据解析线程的程序:DataDealThread=newThread(DataDealMethod);//绑定方法DataDealThread.Start();//线程开始///<summary>///解析接收到的数据///</summary>privatevoidDataDealMethod(){while(true){stringStrRcv=null;try{if(RcvQueue.Count>=1)//从队列中取出数据{byte[]ReceiveDataDeal=RcvQueue.Dequeue();ConvertClass.ConvertByteToHexString(ReceiveDataDeal,refStrRcv);//转换为字符串的方法调用DisplayDataDlg=newDisplayData(DisplayMethod);this.BeginInvoke(DisplayDataDlg,StrRcv);//显示}elseThread.Sleep(1);}catch(Exceptionex){MessageBox.Show(ex.Message,"DataDealWarning");return;}}}
我遇到的问题是:1.当有一次异常抛出后,解析线程不再循环处理数据;2.当我退出界面、关闭该线程时总会抛出“线程正在中止”的异常框;对于第一个问题我想实现的是抛出异常后,点击异常提示框中的“确定”后可以接续处理数据。我将return去掉后也会产生一个问题,即由于数据是不停处理的,要是连续几个数据处理都是异常的,那么就会弹出多个异常框,直至界面卡死。。。我要的就是当抛出异常框后,我点击确认了才接着处理数据,不点击则不处理数据。第二个问题,就是怎么在退出界面,关闭线程的时候,将while循环关闭。另外,请问,可不可以用异步调用的方式处理数据,能的话望给出相关源代码或思路。其实我很不想用这个while循环线程处理数据,但又想不出其他方法来处理......
解决方案
解决方案二:
异常的出现可能导致线程被杀死或者挂起点击确定这个问题可以使用DialogResult来实现将while(true)改成while(flag)等标志位或者if(flag)break;
解决方案三:
线程的实现需要异步实现通知事件.使用BackgroundWorker线程,实现结束,异常通知,我只能说到这里了.
解决方案四:
?我要的就是当抛出异常框后,我点击确认了才接着处理数据,不点击则不处理数据。首先MessageBox.Show(ex.Message,"DataDealWarning");你根本不用return;即可,因为MessageBox是阻塞模式如果你非要加什么那你要用AutoEvenSet这个操作就是异常好手动加阻塞调WaitOne(),点确定后set()就可以了。
解决方案五:
第二点就是把isBackground=true就会自动退出线程了
解决方案六:
引用3楼wyd1520的回复:
?我要的就是当抛出异常框后,我点击确认了才接着处理数据,不点击则不处理数据。首先MessageBox.Show(ex.Message,"DataDealWarning");你根本不用return;即可,因为MessageBox是阻塞模式如果你非要加什么那你要用AutoEvenSet这个操作就是异常好手动加阻塞调WaitOne(),点确定后set()就可以了。
不好意思,这两天比较忙,没及时回复。MessageBox不是阻塞模式的,比如说当我连续发相同错误的命令时,那么就会弹出多个提示框,如果MessageBox是阻塞的话就不会一直弹出提示款了。我加return是为了出现一次错误命令时准备的,当不是连续出现异常时点击提示框后return能返回到while循环。
解决方案七:
引用2楼s8848的回复:
线程的实现需要异步实现通知事件.使用BackgroundWorker线程,实现结束,异常通知,我只能说到这里了.
首先感谢你的回答,但你没看懂我的意思。。。
解决方案八:
引用1楼jinlei59的回复:
异常的出现可能导致线程被杀死或者挂起点击确定这个问题可以使用DialogResult来实现将while(true)改成while(flag)等标志位或者if(flag)break;
我也考虑过这个方法,值得一试。。。