【问题标题】:how to automatically update label using thread如何使用线程自动更新标签
【发布时间】:2014-07-29 19:43:25
【问题描述】:

我想从mod bus 协议中获取数据并使用标签以Windows 形式自动显示和更新。但是我遇到一个问题,我必须点击按钮来显示更新的数据而不是标签自动显示它。我的代码如下,有人可以指出我错在哪里以及如何纠正它。非常感谢:)

private void Call() {

    do
    {
        RequestData(); //get data from mod bus 
        run(a.ToString());
    } while (operation);
}

delegate void CallMethod(string Data);

private void run(string data) {

    if (this.labelO2.InvokeRequired)
    {
        SetRichBoxCallBack d = new SetRichBoxCallBack(run);
        this.Invoke(d, new object[] { data });
    }
    else {
        labelO2.Text = data;
    }
}
Thread thread;

private void button1_Click(object sender, EventArgs e)
{

    thread = new Thread(new ThreadStart(Call));
    thread.Start();
}

public void RequestData()
{
    if (WriteSerialPort(setMessage, 0, 8))
    {
        Thread.Sleep(1000);
        for (i = 0; i < 19; i++)
        {
            MM[i] = (byte)serialPortBoard.ReadByte();
        }

        a = MM[11] << 8 | MM[12];
        b = (int)MM[13] << 8 | MM[14];
    }
 }

【问题讨论】:

标签: c# multithreading winforms visual-studio-2010


【解决方案1】:

用下面的代码替换你的代码:

private void run(string data) {

    //if (this.labelO2.InvokeRequired)
    //{
    //    SetRichBoxCallBack d = new SetRichBoxCallBack(run);
    //    this.Invoke(d, new object[] { data });
    //}
    //else {
    //    labelO2.Text = data;
    //}

    this.Invoke(new MethodInvoker(delegate {labelO2.Text = data;}));

}

【讨论】:

  • 你试过调试你的代码吗?执行过程中是否有任何异常引发?
  • 只有点击按钮才能更新最新数据。我调试的时候,没有异常。
  • 没什么变化,当我使用计时器时,它可以工作。但是当我尝试使用线程时,我仍然需要按钮来使其更新
  • 做一件事。在public void RequestData() 函数中,注释所有代码并更新一个变量。将此变量分配给标签文本。例如:取一个全局整数变量,在 RequestData 函数中递增,并显示在标签上,检查它是否有效。我尝试像那样运行您的代码,并且标签正在正确更新。
  • 我试过了,但是只能显示最新的更新。我想向用户展示更新过程。有什么办法改善吗?
猜你喜欢
  • 2018-04-19
  • 2019-12-06
  • 2015-08-04
  • 1970-01-01
  • 2019-10-29
  • 1970-01-01
  • 2022-06-10
  • 2011-05-14
  • 1970-01-01
相关资源
最近更新 更多