文本标签每隔一秒自动更新温度读数

时间:2014-05-16 16:17:23

标签: c# .net winforms

我创建了这段代码,使用我在网上找到的MemoryReader.dll从内存地址读取温度读数,然后在标签CurrentTemp.text中列出温度读数。

温度计不断更新,所以我希望标签能够更新温度。然后,我希望能够通过单击按钮来中断更新温度的for循环,以允许我更改菜单上的其他功能(尚未实现)。

我无法找到一种方法来设置一个开始/停止按钮,用于编辑可从button1_Click方法和Stop_Click方法访问的变量,因此我拥有{{1} }方法将Stop_Click标签从打开更改为关闭,这允许关闭控制。

现在代码工作除了for循环。当我添加for循环时,它会导致应用程序在单击“开始”按钮时冻结,并且表单上的温度值也不会更新。

我在stackoverflow和google上进行了彻底的搜索,但我似乎找不到可以开始工作的答案。这是代码:

Status.Text
编辑:@AsadAli我对对象/类/方法的工作原理有点生疏,所以我花了几天时间来研究它。我最终设法让Timer工作,并通过点击按钮进行初始化。我也有问题,因为跨线程访问,Timer能够访问Windows窗体对象来更改文本,并通过在运行该窗体的线程上调用委托来解决这个问题。我现在在启用和禁用计时器时遇到问题。我把一个由事件处理程序Stop_Click控制的按钮,但它说"名称' aTimer'在当前背景下不存在"这是我的代码:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using MemoryEditor;

namespace WindowsFormsApplication1
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        public void button1_Click(object sender, EventArgs e)
        {
            for (; ; )
            {
                if (Status.Text == "on")
                {
                    Memory oMemory = new Memory(); //Create Memory Class
                    if (oMemory.OpenProcess("D4IThermoMeter")) //Open Handle
                    {
                        double data1 = oMemory.ReadDouble(0x0049E054, new int[] { 0x8 });
                        CurrentTemp.Text = data1.ToString();
                    }

                }
                System.Threading.Thread.Sleep(1000);
                this.Refresh();

            }
        }

        private void CurrentTemp_Click(object sender, EventArgs e)
        {

        }

        public void Stop_Click(object sender, EventArgs e)
        {
            if (Status.Text == "on")
            {
                Status.Text = "off";
            }
            else if (Status.Text == "off")
            {
                Status.Text = "on";
            }
        }
    }
}

2 个答案:

答案 0 :(得分:1)

我同意LarsTech。使用一个定时器,其间隔为1000,并执行当前for循环所做的事情(在tick事件中)。

private void MyTimer_Tick(object sender, EventArgs e)
{
    Memory oMemory = new Memory(); //Create Memory Class
    if (oMemory.OpenProcess("D4IThermoMeter")) //Open Handle
    {
        double data1 = oMemory.ReadDouble(0x0049E054, new int[] { 0x8 });
        CurrentTemp.Text = data1.ToString();
    }
    this.Refresh();
}

正如您所注意到的,我删除了if语句:因为在Stop按钮上,您还应该添加一个语句来启用/禁用计时器。

public void Stop_Click(object sender, EventArgs e)
{
    if (Status.Text == "on")
    {
        Status.Text = "off";
        MyTimer.Enabled = false;
    }
    else if (Status.Text == "off")
    {
        Status.Text = "on";
        MyTimer.Enabled = true;
    }
}

上面的MyTimer变量是System.Windows.Forms.Timer。如果您想使用System.Timers.Timer,请参阅以下方法:

System.Timers.Timer MyTimer = new System.Timers.Timer();
void UpdateMyTimer() //A one-time call to this function must be made.
{
    MyTimer.Elapsed += new ElapsedEventHandler(MyTimer_Tick);
    MyTimer.Interval = 1000;
    MyTimer.Enabled = true;
}

如果button1的目的是启动计时器,那么只需将上面的代码粘贴到button1_Click的正文中。

答案 1 :(得分:0)

像<{1}}事件这样的UI交互在UI线程上运行。因此,在Click上执行的for循环应该阻止UI线程同时更新UI。有几种方法可以在后台更新UI。您可以使用昂贵的Button_click控件。以下是使用Timer

更新UI的简单方法
Delegate