我创建了这段代码,使用我在网上找到的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";
}
}
}
}
答案 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)
Click
上执行的for
循环应该阻止UI线程同时更新UI。有几种方法可以在后台更新UI。您可以使用昂贵的Button_click
控件。以下是使用Timer
更新UI的简单方法
Delegate