【发布时间】:2018-05-16 02:30:26
【问题描述】:
这里是新手,我的表单正在监视 Caps Lock 状态,但使用了大约 50% 的 CPU,我认为这与 Application.Idle += Application_Idle 和 Application.Idle -= Application_Idle 有关。一旦我删除了那些我的表单没有监控 Caps Lock 状态,有什么建议吗?
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
namespace CapsLockChecker
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
Application.Idle += Application_Idle;
}
private void Form1_Load(object sender, EventArgs e)
{
}
void Application_Idle(object sender, EventArgs e)
{
if (Control.IsKeyLocked(Keys.CapsLock))
{
label1.Text = "CapsLock is On";
pictureBox1.ImageLocation = "C:\\Users\\user\\source\\repos\\CapsLockChecker\\CapsLockChecker\\if_Circle_Green_34211.png";
}
else
{
label1.Text = "CapsLock if Off";
pictureBox1.ImageLocation = "C:\\Users\\user\\source\\repos\\CapsLockChecker\\CapsLockChecker\\if_Circle_Red_34214.png";
}
}
protected override void OnFormClosed(FormClosedEventArgs e)
{
Application.Idle -= Application_Idle;
base.OnFormClosed(e);
}
}
}
【问题讨论】:
-
我会改用计时器来监控。像 50 毫秒或 100 毫秒这样的合理时间不会被用户注意到,但会大大降低 CPU 负载。顺便说一句,感谢您为您的问题付出的努力。它使回答变得更加容易。
-
Application.Idle被调用太频繁了。您应该在该代码中做尽可能少的事情,并且轮询密钥状态太多了。改用计时器;您不可能需要频繁更新键盘状态。如果您改为每四分之一秒 (250 毫秒) 轮询一次,用户将不会注意到延迟,并且您将使用更少的 CPU。 -
更好的是,在按下 CapsLock 时捕获事件。
-
Application.Idle 并没有什么问题,其实是一个很好的发现程序bug的方法。该问题是由 PictureBox.ImageLocation 分配引起的。它假定它总是必须重新加载图像,即使它是同一个文件。除了燃烧 100% 核心之外,您还应该看到程序的内存使用量猛增。恭喜,这样的错误很难找到,而且这里也没有人看到它。做对了this way.
-
@HansPassant 谢谢汉斯,我很高兴我发现了一些新东西;)
标签: c#