日期:2014-05-18  浏览次数:21199 次

继续问: 串口接收,线程里还是 有点小问题
串口接收时,
在一个按钮里,开启线程,
现在用
 
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