读书人

继续问: 串口接收线程里还是 有点小

发布时间: 2012-08-13 13:21:53 作者: rapoo

继续问: 串口接收,线程里还是 有点小问题
串口接收时,
在一个按钮里,开启线程,
现在用

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
[解决办法]
串口不关闭就结束线程,抛出异常是肯定的,不过你捕获下异常后,程序是否还能正常进行,串口是否还能重新打开,这才是最重要的,毕竟你就没有通过正常途径终止线程,想不出异常信息是不可能的。

读书人网 >C#

热点推荐