【问题标题】:How to reduce the processor consumption?如何降低处理器消耗?
【发布时间】:2013-12-10 12:31:57
【问题描述】:

我制作了一个 C# 闹钟,它工作正常。问题是它运行时会消耗 20% 的处理器(在 i5 2410M 处理器上)我该怎么办? 这是我的代码:

using System;
namespace assigment1
{
    class Program
    {
        static void Main(string[] args)
        {
            DateTime uptime = new DateTime (2013,12,10,4,0,0);
            Console.WriteLine("This alarm is set to go off at 4:00 am");
            while (true)
            {

                if (DateTime.Now.Minute == uptime.Minute && DateTime.Now.Hour == uptime.Hour)
                {
                    for (int j = 1000; j < 22767; j++)
                     {


                        Console.Beep(j, 500);
                        Console.Write("Wake up! it is {0}:{1} already! ", DateTime.Now.Hour, DateTime.Now.Minute);
                     }

                }
             }
        }
    }
}

【问题讨论】:

  • 实际上没有任何延迟(而且只有半秒)你会很高兴它只占用了 20% :-)
  • 你问错问题了。您应该问为什么它几乎将所有 CPU 用于其中一个内核。与其解决问题,不如了解原因。
  • 另外,这是作业*。见stackoverflow.com/questions/8934570/…

标签: c# time clock alarm processor


【解决方案1】:

这是因为您的 while 循环连续运行而没有任何中断。添加Thread.Sleep。这将在检查之间添加一个暂停并大大提高您的性能:

class Program
{
    static void Main(string[] args)
    {
        DateTime uptime = new DateTime (2013,12,10,4,0,0);
        Console.WriteLine("This alarm is set to go off at 4:00 am");
        while (true)
        {

            if (DateTime.Now.Minute == uptime.Minute && DateTime.Now.Hour == uptime.Hour)
            {
                for (int j = 1000; j < 22767; j++)
                 {


                    Console.Beep(j, 500);
                    Console.Write("Wake up! it is {0}:{1} already! ", DateTime.Now.Hour, DateTime.Now.Minute);
                 }                     

            }

            Thread.Sleep(1500); // Sleep 1.5 seconds.
         }
    }
}

【讨论】:

  • 无限循环和线程休眠通常表明应该使用计时器...
【解决方案2】:

您需要计算直到警报响起的时间并使用timer class。只需将间隔设置为警报前的剩余时间,然后停止计时器。像这样的东西应该可以工作

DateTime alarmTime = new DateTime(2013,12,10,4,0,0);
System.Windows.Forms.Timer alarmTimer = new System.Windows.Forms.Timer();
alarmTimer.Interval = (alarmTime - DateTime.Now).Milliseconds;
alarmTimer.Tick += alarmTimer_Tick;
alarmTimer.Start();

您的活动

void alarmTimer_Tick(object sender, EventArgs e)
{
    alarmTimer.Stop();
    Console.Write("Wake up! it is {0}:{1} already! ", DateTime.Now.Hour, DateTime.Now.Minute);
}

【讨论】:

  • 我正在做控制台应用程序,我没有表单。而且我也没有蜱虫。
  • 你在这里打勾是为了什么?
【解决方案3】:

如果你想要一个闹钟,为什么不使用Timer Class

【讨论】:

  • 计时器会在时间限制后(例如 5 小时后)关闭,但我希望它一直运行并在适当的时间关闭。
  • 这不是真的,这取决于您将使用哪种类型的计时器此链接讨论.net msdn.microsoft.com/en-us/magazine/cc164015.aspx提供的所有类型的计时器
【解决方案4】:

我不知道你是否可以这样做,但你可以通过Priority 属性更改正在执行的线程的线程优先级。您可能想尝试以下方法:

Thread.CurrentThread.Priority = ThreadPriority.Lowest;

另外,我不认为你真的想限制它。如果机器处于空闲状态,您希望它忙于任务,对吗? ThreadPriority 有助于将此信息传达给调度程序。

【讨论】:

    【解决方案5】:

    您将检查放在一个 while 循环中,这意味着它将占用您的大部分处理器时间。

    我建议看看这篇文章 (http://www.infolet.org/2012/11/create-digital-clock-on-c-sharp-program-code.html),它描述了如何使用 Timer 类来做到这一点。

    更新: 这个 SO 答案非常好,如果您乐于使用事件,可能更适合; https://stackoverflow.com/a/1493235/465404

    【讨论】:

      【解决方案6】:

      我认为您绝对应该使用Timer 类作为您的闹钟,并相应地更改刻度interval。这也可以让您轻松管理警报的重复发生。

      因此,您的时间间隔将是设置闹钟与您希望闹钟响起之间的时间差。

      我已经在 Win Forms 应用程序中同时使用了其中的多个,资源利用率非常低。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2012-02-29
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-02-18
        • 2013-12-16
        相关资源
        最近更新 更多