【问题标题】:GetForegroundWindow() with Ticker C# - Reduce CPU Usage使用 Ticker C# 的 GetForegroundWindow() - 减少 CPU 使用率
【发布时间】:2011-03-23 22:08:54
【问题描述】:

我正在创建一个监控计算机使用情况的程序。该程序的一部分要求我始终知道前景窗口是什么。这是通过这段代码实现的:

    // Returns the name of the process owning the foreground window.
    private static Process GetForegroundProcess()
    {
        try
        {
            IntPtr hwnd = GetForegroundWindow();
            // The foreground window can be NULL in certain circumstances, 
            // such as when a window is losing activation.
            uint pid;
            GetWindowThreadProcessId(hwnd, out pid);

            Process p = Process.GetProcessById((int)pid);

            return p;
        }
        catch (Exception)
        {
            return null;
        }
    }

我遇到的问题是 CPU 消耗。这逐渐使用了我所有的 CPU,因为它是在每秒滴答的代码中调用的。程序中的核心功能需要每秒滴答作响。

然后我的问题是,有没有办法在不让我的程序冻结计算机的情况下解决这个问题?

感谢您的宝贵时间和回复!

【问题讨论】:

  • 这没有意义。每秒计时一次然后调用该代码的计时器不会使用 100% 的 CPU。还有其他问题。
  • 您在处理完这些Process 对象后是否对它们调用Dispose

标签: c# timer monitor cpu-usage foreground


【解决方案1】:

在代码运行时禁用计时器!。如果它的速度较慢,那么它会锁定你的系统。 在后台线程上执行代码,看看是否有不同的 API 可以更好地获取相同的信息。

【讨论】:

  • 问题是我需要计时器一直运行,所以禁用它会是个问题。此外,不幸的是,我还没有找到任何其他 API 可以满足我的需要,但是如果它的速度较慢,那么您的关于它会锁定系统的信息,那么计时器是个好东西,这让我不以为然。
  • 当它运行的代码比定时器频率慢时,你“必须”“禁用”定时器。如果它仍在运行,请跳过一些缓慢的更新调用。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-06-01
  • 2015-08-02
  • 1970-01-01
  • 2013-12-05
  • 1970-01-01
  • 1970-01-01
  • 2017-08-24
相关资源
最近更新 更多