首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > .NET > C# >

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

2012-08-13 
继续问: 串口接收,线程里还是 有点小问题串口接收时,在一个按钮里,开启线程,现在用C# codeC# codeserialsR

继续问: 串口接收,线程里还是 有点小问题
串口接收时,
在一个按钮里,开启线程,
现在用
 
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
[解决办法]
串口不关闭就结束线程,抛出异常是肯定的,不过你捕获下异常后,程序是否还能正常进行,串口是否还能重新打开,这才是最重要的,毕竟你就没有通过正常途径终止线程,想不出异常信息是不可能的。

热点排行