问题有点怪,请看下面程序:
 
private void DeviceConnect()
        {
//getVoltage(id);//读电压
                tmrRead.Enabled = true;//启动timer,并激活timer tick中的程序
Thread.Sleep(100);
                for (int cycInt = 1; cycInt <= 3; cycInt++)
                {
                    createChart(cycInt,m_nums);//创建chart并显示电压值
                }
} private void tmrRead_Tick(object sender, EventArgs e)// do the time cycle to get voltage and show Voltage in Chart
        {
            countCycle++;
//通过rich text box显示取到的电压值,监察是否取到
            rtbWarning.Text = countCycle.ToString()+ "  V7 voltage is: " + retrived.V7.ToString();
            if (getVoltage(id))//读电压
            {
                showChart(BAT_num, m_numCells);//用timer来一遍遍循环不停地读电压并显示在创建的chart中 
                
            }
            else
            {
                rtbWarning.Text = "can't read message from UBM";
            }
           
        }以上程序中,我想通过timer tick循环读电压,timer tick读完的电压在rich text box中能显示,但chart创建时取同样的值到得却是空值。
但我如果将timer.enable=true;注释掉,将getVoltage(id);放在DeviceConnect中运行,createChart显示的图表就能取到值。
电压值是放在一个全局变量中。
为什么timer tick 读的值,在deviceconnect中读不到?

解决方案 »

  1.   

    DeviceConnect属于子线程的,你这个读电压的函数不能在子线程里调用,需要通过postmessage函数触发主线程消息在主线程里调用。C#里应该有invoke之类的吧,总之就是跳转到主线程调用读电压函数。
      

  2.   

    我的程序结构是这样的:
    public partial class btGetUBMData : Form
        {
    private void Main_Load(object sender, EventArgs e)
            {
    ....
    deviceConnect();
    ....
    }
    private void deviceConnect()
    {
    ....
    tmrRead.Enabled = true;
    createChart(cycInt,m_nums);//创建chart并显示电压值....
    }
    private void tmrRead_Tick(object sender, EventArgs e)
    {
    ....
     getVoltage(UBMid))
    ....   
    }
    }
    问:应该怎样添加postmessage语句?
      

  3.   

    在窗体上设置tmrRead.Enabled = true
      

  4.   

    好像是2.0以后不许子线程跟新主线程的Control
    用Invoke可以解决,
    试一试下面的
    private delegate void DelegNull();
     private void tmrRead_Tick(object sender, EventArgs e)// do the time cycle to get voltage and show Voltage in Chart
            {
    this.Invoke((DelegNull)delegate
    {
                                                countCycle++;
                                    //通过rich text box显示取到的电压值,监察是否取到
                                                rtbWarning.Text = countCycle.ToString()+ "  V7 voltage is: " + retrived.V7.ToString();
                                                if (getVoltage(id))//读电压
                                                {
                                                    showChart(BAT_num, m_numCells);//用timer来一遍遍循环不停地读电压并显示在创建的chart中 
                                                    
                                                }
                                                else
                                                {
                                                    rtbWarning.Text = "can't read message from UBM";
                                                }
    });
               
            }
      

  5.   

    再多问一个问题:我试着用thread 来执行一段程序:
    {
    ....
    Thread myThread = new Thread(new ThreadStart(DoCycle));
    myThread.Start();
    ....
    }
    private void btGetData_FormClosing(object sender, FormClosingEventArgs e)
            {
    myThread.abort();
    This.Closing        }
    关闭后,在TaskManager仍然可以看到程序在运行,问:怎样可以在关闭程序时完全退出。