本帖最后由 TANGLIJUNASP 于 2010-03-14 13:20:45 编辑

解决方案 »

  1.   

         #region
            public void StartThread()
            {
                StopThread();
                timerThread = new Thread(new ThreadStart(UpdataThread));
                //获取或设置一个值,该值指示某个线程是否为后台线程。
                timerThread.IsBackground = true;
                timerThread.Start();
            }
            //停止线程
            public void StopThread()
            {
                if (timerThread != null)
                {
                    //中断线程
                    timerThread.Interrupt();
                    timerThread = null;
                }
            }
            //更新线程
            public void UpdataThread()
            {
                try
                {
                    //在对控件的调用方法进行调用时,或需要一个简单委托又不想自己定义时可以使用该委托。
                    MethodInvoker mi = new MethodInvoker(this.TreadReadStdMeterPower);
                    //MethodInvoker mi = new MethodInvoker(this.AutoAdjust);
                    while (true)
                    {                    //在创建控件的基础句柄所在线程上异步执行指定的委托
                        this.BeginInvoke(mi);
                        //timer1.Enabled = true;
                        //timer1.Interval = 2000;
                        Application.DoEvents();
                        Thread.Sleep(1000);
                    }
                }
                catch (ThreadInterruptedException)
                {
                    //针对具体问题定制异常抛出显示
                }
                finally
                {
                    //做一些处理
                }
            }        #endregion 
            
      

  2.   

      private void TreadReadStdMeterPower()
            {
                byte[] data = new byte[255];
                string[,] expData = null;
                object[] tmpData = new object[34];
                byte[] bytSendData = new byte[255];            try
                {
                    bytSendData = CL3013.ReadStdMeterData();
                    data = comStdMeterPower.SendAndRecived(bytSendData);
                    if (data != null)
                    {
                        if (data[4].ToString("x2") == "50")
                        {
                            clsCLT1_1.AnsDatExplan(data, ref expData);                        Ua.Text = expData[0, 2];
                            Ub.Text = expData[0, 1];
                            Uc.Text = expData[0, 0];
                            Ia.Text = expData[0, 5];
                            Ib.Text = expData[0, 4];
                            Ic.Text = expData[0, 3];
                            PhiA.Text = expData[3, 2];
                            PhiB.Text = expData[3, 0];
                            PhiC.Text = expData[3, 0];
                            P.Text = expData[4, 3];
                            Q.Text = expData[4, 7];
                            S.Text = expData[5, 3];
                            txtUa.Text = Ua.Text;
                            txtIb1.Text = Ia.Text;
                            txtIb2.Text = Ib.Text;
                            txtP1.Text = expData[4, 2];
                            txtP2.Text = expData[4, 1];                        double tmpUa = Convert.ToDouble(expData[0, 2]) * 10000;
                            double tmpIa = Convert.ToDouble(expData[0, 5]) * 1000000;
                            double tmpIb = Convert.ToDouble(expData[0, 5]) * 1000000;
                            double tmpPa = Convert.ToDouble(expData[4, 2]) * 1000000;
                            double tmpPb = Convert.ToDouble(expData[4, 1]) * 1000000;
                            UaValues = (int)tmpUa;
                            IaValues = (int)tmpIa;
                            IbValues = (int)tmpIb;
                            PaValues = (int)tmpPa;
                            PbValues = (int)tmpPb;                    }
                        else
                        {
                            structErrorMsg.Addlog(1, "返回的数据不符合协议要求!", txtMsg);
                        }                }
                    else
                    {
                        structErrorMsg.Addlog(1, "没有返回数据!", txtMsg);                }            }
                catch (Exception ex)
                {
                    structErrorMsg.Addlog(1, "没有返回数据!错误原因:" + ex.ToString(), txtMsg);
                }
            }
      

  3.   

     public byte[] SendAndRecived( byte[] tmpByte)
            {
                lock (snyBark)
                {
                    try
                    {
                        //参数输入的不合法
                        if (tmpByte == null || tmpByte.Length <= 0 || !this._isOpen) return null;
                        structErrorMsg.Addlog(2, clsComApp.Convert_ByteArray_HexString(tmpByte), txtMsg);
                        sp.Write(tmpByte, 0, tmpByte.Length);
                        Application.DoEvents();
                        Thread.Sleep(DelayTime);                    int count = sp.BytesToRead;
                        //缓冲区中没有数据
                        if (count == 0)
                            return null;
                        byte[] temp_Data = new byte[count];
                        int num = sp.Read(temp_Data, 0, count);                    for (int i = 0; i < count; i++)
                        {
                            temp_Data[i] = temp_Data[i];
                        }
                        Szclou.Cl1000at.Adjust.structErrorMsg.Addlog(1, Szclou.Cl1000at.Adjust.clsComApp.Convert_ByteArray_HexString(temp_Data), txtMsg);
                        return temp_Data;
                    }
                    catch
                    {
                        return null;
                    }
                }
            
      

  4.   

    while (true)
    {//在创建控件的基础句柄所在线程上异步执行指定的委托
    this.Invoke(mi);
    //timer1.Enabled = true;
    //timer1.Interval = 2000;
    Application.DoEvents();
    Thread.Sleep(100);
    }将UpdataThread方法中的循环修改下,sleep也不要太长时间
      

  5.   

    关注,想问一下怎么在windows窗体中用线程控制串口(即从串口中读或写数据吧),只要编程思路即可。
      

  6.   

    因为见到的线程编程基本上都是从Main(),开始的,不知道怎么在windowsForm里做。
      

  7.   

    问题已得到解决,对ui交互的控件事件做了委托;同时,也顺便回复sp1234,calltaotao两个人的发言:
     
    我是很礼貌的提出源码,希望你们能帮我解决问题;我写的代码怎么啦,是有问题,才请教你们
    我现在是在赶项目进度,解决问题是第一准则,没功夫遵循那么多规则);我见过牛B的人,但没见过你这么不懂礼貌的人;
    你这么不把人家放在眼里,我想你在公司也得不到别人的尊重;如再发现有人不尊重别人,直接把你从本版剔除出去