继续问: 串口接收,线程里还是 有点小问题
串口接收时,
在一个按钮里,开启线程,
现在用
C# code
- C# code
serialsReceiveThread.Suspend();
这句来暂停,线程,貌似也没有啥问题,但是代码下面是一条绿线,总觉得影的慌,
应该不是最好的办法。
想想应该有更好的办法,特来请教一下,如何协调好这个线程
1 是串口通信
2 打开串口,不在这个按钮里操作,当打开串口后,不点关闭,或推出软件时,是不关闭串口的
3 在第二步,打开串口后,串口则一直处于打开状态
4 在下面按钮,开启接收线程,按钮复用,即开启接收,和停止接收都在一个按钮里处理。
5 在第四步内,停止线程时,串口是不要关闭的,
问题就出在这步上,,
即:串口不关闭时,
serialsReceiveThread.Abort(); 用这句关闭线程时,报异常了。
(如果,关闭线程时,关闭了串口,则用abort()关闭线程没有问题)
而关闭线程时,也关闭串口,逻辑上有不符合要求了
可能问题是:
1 关闭线程时,,串口还在接收,导致了异常
2 线程关闭时,, 还有数据在向 listview控件上刷新,导致了异常
3 委托函数引起的?
请教如何消除这个异常!
谢谢
开启,关闭,接收线程的代码:
C# code
- C# code
private void btnListTags_Click(object sender, EventArgs e) { try { if (btnListTags.Text == "Close") { btnListTags.Text = "Open"; btnListTags.Enabled = true; timer1.Enabled = false; serialsReceiveThread.Suspend(); } else { timer1.Enabled = true; btnListTags.Text = "Close"; //开启接收线程 serialsReceiveThread = new Thread(new ThreadStart(serialThreadReceive)); serialsReceiveThread.Start();//开始接收线程 } } catch (Exception ex) { } }
接收线程:
C# code
- C# code
private void serialThreadReceive() { int lenStr = 0; int recvlen; byte[] buffer = new byte[1024]; int offset = 0; int count = 2; while (true) { try { recvlen = sl.readDatas(ref buffer, offset, count); } catch { break; } Dosomething() //解码过程 doPCstring(buffer);// 将解码过的数据,准备处理后显示到listView控件上}}
C# code
- C# code
private void doPCstring(byte[]buf) { Dosomething()// 就是将字节数组内内容,并接成字符串 if (PCs != "") { showPCToListView(PCLen, PCs, idLen, IDS, userLen, Users, tsNo); // 将字符串,显示到listView 控件上 } }
最后将字符串,刷新到 listView 上的代码:
C# code
- C# code
private void showPCToListView(string PCLen,string PCs,string idLen,string IDS,string userLen,string Users,string tsNo ) { if (!listView1.InvokeRequired) { if (listView1.Items.Count < 1)// 如果 listview上的记录为空 则添加一个记录; { dosomething () } else { Dosomething() } }//!listView1.InvokeRequired else { ShowMsgHandler handler = new ShowMsgHandler(showPCToListView); BeginInvoke(handler, new object[] { PCLen,PCs ,idLen,IDS,userLen,Users,tsNo}); } }
刷新到界面时,用的委托
C# code
- C# code
private delegate void ShowMsgHandler(string msg,string msg2,string msg3,string msg4,string msg5,string msg6,string msg7);
[解决办法]
http://topic.csdn.net/u/20120716/10/2dee25a6-45b5-4019-ac27-04f3ab1cb0a5.html?seed=8961565&r=79136550#r_79136550
[解决办法]
串口不关闭就结束线程,抛出异常是肯定的,不过你捕获下异常后,程序是否还能正常进行,串口是否还能重新打开,这才是最重要的,毕竟你就没有通过正常途径终止线程,想不出异常信息是不可能的。