失败的线程设计

      这几天在用SerialPort写一个串口调试程序 ,串口调试程序有两种发送方式,一种是文本发送,另一种是16进制发送。在写16进制发送方式时,有开启一个线程,用于实时检测发送数据格式的合法性,并把发送区的字符串转化成对应的字节数组。不过在调试过程中,会导致UI线程速度很慢。

以下是我写的程序:

private Thread CheckSendDataType;

CheckSendDataType = new Thread(new ThreadStart (CheckSendData));创建一个线程,用于识别发送区的数据格式

//创建一个线程,用于识别发送区的数据格式
        private void CheckSendData()
        {
            while (true)   //线程一直运行的标志
            {
                if (bSendHex == true)
                {
                    if (strSendData != "")
                    {
                        try
                        {
                            Monitor.Enter(this);
                            //加入格式检测代码
                            bValidData = true;
                            foreach (char chrTemp in strSendData)    //检测是否是16进制的字符
                            {
                                if (chrTemp == 0x20)
                                    continue;
                                else if (chrTemp >= 0x30 && chrTemp <= 0x39)
                                    continue;
                                else if (chrTemp >= 0x41 && chrTemp <= 0x46)
                                    continue;
                                else if (chrTemp >= 0x61 && chrTemp <= 0x66)
                                    continue;
                                else
                                {
                                    bValidData = false;
                                    break;
                                }

                            }
                            if (bValidData == true)
                            {
                                try
                                {
                                    String[] strData = strSendData.Split(Convert.ToChar(0x20));
                                    int index, intCount = strData.Length;
                                    byte[] bytDataTemp = new byte[intCount];
                                    for (index = 0; index < intCount; index++)
                                    {
                                        if (strData[index].Length > 2)  //每个16进制数据最多2个字符。
                                        {
                                            bValidData = false;
                                            break;
                                        }
                                    }
                                    if (bValidData == true)
                                    {
                                        for (index = 0; index < intCount; index++)
                                        {
                                            bytDataTemp[index] = Convert.ToByte(strData[index], 16);//把字符串转化成对应的字节数组
                                        }
                                        bytSendData = bytDataTemp;
                                        bValidData = true;
                                    }
                                }
                                catch (Exception ex)
                                {
                                    Console.WriteLine(ex.Message);
                                    bValidData = false;
                                }
                                finally
                                {

                                }
                            }

                        }
                        catch (Exception ex) { Console.WriteLine(ex.Message); }
                        finally
                        {
                            Monitor.Exit(this);
                        }
                    }
                }
            }
        }

//选择16进制发送方式,启动检测数据线程,并置位16进制发送标志。
        private void chkSendHex_CheckedChanged(object sender, EventArgs e)
        {
            if (bComOpen == true)
            {
                if (chkSendHex.Checked == true)
                {
                    if (CheckSendDataType.ThreadState == ThreadState.Unstarted)
                        CheckSendDataType.Start();
                    bSendHex = true;
                }
                else
                    bSendHex = false;
            }
        }

//只要发送区的文本发生变化就触发事件。发现:这样的话会使得UI线程变得很慢。
        private void txtSend_TextChanged(object sender, EventArgs e)
        {
            if (bComOpen == true)
            {
                try
                {
                    Monitor.Enter(this);
                    strSendData = txtSend.Text;
                }
                catch (Exception ex) { Console.WriteLine(ex.Message); }
                finally
                {
                    Monitor.Exit(this);
                }
            }
        }

 

其实,自己对应该在怎么时候启动检测数据格式线程比较合适,和对线程实行过程的设计也不是很清楚。不知道哪位网友有什么好的想法,可以指教一下偶。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值