2013-12-10 1 views
0

Я сделал будильник 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); 
        } 

       } 
      } 
     } 
    } 
} 
+0

На самом деле без каких-либо задержек (и будь то только полсекунды) вы можете быть рады, что это займет всего 20% :-) –

+0

Вы задаете неправильный вопрос. Вы должны спросить, почему он берет почти весь процессор для одного из ядер. Вместо того, чтобы фиксировать проблему, узнайте, в чем причина. – Skizz

+0

Плюс, это назначение *. См. Http://stackoverflow.com/questions/8934570/c-sharp-namespaces-and-assemblies-best-practice –

ответ

1

Необходимо рассчитать время до будильника и использовать 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); 
} 
+0

Я делаю консоль приложения, у меня нет форм. и у меня также нет галочки. –

+0

, для чего вы использовали тик? –

2

Это происходит потому, что ваш 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. 
     } 
    } 
} 
+1

Бесконечный цикл и спящий поток часто указывают на то, что таймер должен использоваться ... – ken2k

1

если вы хотите будильник, почему вы не используете Timer Class

+0

таймер заставить его уйти по истечении срока (например, через 5 часов), но я хочу, чтобы он продолжал работать все время и уходил, когда настало подходящее время. –

+0

это неправда, зависит от того, какой тип таймера вы будете использовать эту ссылку, обсудите все типы таймеров, предлагаемые .net http://msdn.microsoft.com/en-us/magazine/cc164015.aspx –

1

Я не знаю, если вы можете сделать это, но вы можете изменить приоритет потока исполняемого потока через свойство Priority. Вы можете попробовать следующее:

Thread.CurrentThread.Priority = ThreadPriority.Lowest; 

Кроме того, я не думаю, что вы действительно хотите его закрыть. Если машина в противном случае простаивает, вы хотите, чтобы она занялась задачей, верно? ThreadPriority помогает сообщать об этом планировщику.

1

Вы помещаете чек в цикл while, а это означает, что он будет использовать большую часть вашего процессорного времени.

Я бы предложил просмотреть эту статью (http://www.infolet.org/2012/11/create-digital-clock-on-c-sharp-program-code.html), которая описывает, как это сделать, используя класс таймера.

ОБНОВЛЕНИЕ: Этот ответ так хорош и может быть более подходящим, если вы счастливы использовать события; https://stackoverflow.com/a/1493235/465404

0

Я думаю, что вы должны обязательно использовать в Timer класс для сигнализации и просто изменить клеща интервал соответственно. Это легко позволит вам управлять повторением тревоги.

Таким образом, вы будете интервал времени, когда будет установлен будильник, и когда вы хотите, чтобы он погас.

Я использовал несколько из них, работающих одновременно в приложении Win Forms с очень небольшим использованием ресурсов.

 Смежные вопросы

  • Нет связанных вопросов^_^