2015-02-04 1 views
2

Я пытаюсь написать очень рудиментарную программу, которая проверяет использование моего процессора и плунжера и сообщает мне о текущем времени безотказной работы. Если процессор или барабан превышают определенный порог, он устно объявит об этом и предупредит меня. Я пытаюсь использовать TimeSpan для автоматического увеличения времени работы системы от секунд до нескольких дней, часов, минут, секунд. Когда я запускаю код, он говорит 0 дней 0 часов 0 минут и 0 секунд. Тем не менее, он объявляет его правильно в hourswhen, я не использую TimeSpan.C# сталкивается с проблемами с TimeSpan. Преобразование времени безотказной работы в секундах/днях

#region My Performace Counters 
     //this pulls the current cpu load in % 
     PerformanceCounter perfCpuCount = new PerformanceCounter("Processor Information", "% Processor Time", "_Total"); 

     //this pulls the available memory in MBytes 
     PerformanceCounter perfAvailableMemoryCount = new PerformanceCounter("Memory", "Available MBytes"); 

     //this shows the systems uptime (in seconds) 
     PerformanceCounter perfUptimeCount = new PerformanceCounter("System", "System Up Time"); 
     #endregion 

     TimeSpan uptimeSpan = TimeSpan.FromSeconds(perfUptimeCount.NextValue()); 
     string systemUptimeMessage = string.Format("The current system uptime is {0} days {1} hours {2} minutes and {3} seconds", 
      uptimeSpan.TotalDays, 
      uptimeSpan.TotalHours, 
      uptimeSpan.TotalMinutes, 
      uptimeSpan.TotalSeconds 
      ); 

     Console.WriteLine("{0}", systemUptimeMessage); 


     //tell the user what the current system uptime is 
     synth.Speak(systemUptimeMessage); 

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

//infinte While loop 
     while(true) 
     { 
      //get the current performance values 
      int currentCpuPercentage = (int)perfCpuCount.NextValue(); 
      int currentAvailableMemory = (int)perfAvailableMemoryCount.NextValue()/1024; 
      int currentUptime = (int)perfUptimeCount.NextValue()/3600; 

      //Every 1 Second prints the cpu load (%) and available mem (GB) to screen 
     Console.WriteLine("Cpu Load  : {0}%", currentCpuPercentage); 
     Console.WriteLine("Available Memory: {0} Gigabytes", currentAvailableMemory); 
     Console.WriteLine("System Uptime : {0} hours", currentUptime);   


      //if cpu is over 80 percent, vocally say the current percent 
      if(currentCpuPercentage > 80) 
      { 
       if (currentCpuPercentage == 100) 
       { 
        string cpuLoadVocalMessage = String.Format("You're CPU is about to catch fire!"); 
        synth.Speak(cpuLoadVocalMessage); 
       } 

       else 

       { 
        string cpuLoadVocalMessage = String.Format("The current CPU load is {0} percent", (int)currentCpuPercentage); 
        synth.Speak(cpuLoadVocalMessage); 
       } 
      } 

      //if available memory is less than 1 vocally say the current available memory 
      if(currentAvailableMemory < 1) 
      { 
       string memAvailVocalMessage = String.Format("The current available Memory is {0} Gigabytes", (int)currentAvailableMemory); 
       synth.Speak(memAvailVocalMessage); 
      } 





     Thread.Sleep(1000); 

      //just an extra space 
     Console.WriteLine(); 

      //end of loop 
     } 

Я не намерен сохранить сообщение безотказной работы в цикле While, я просто оставить его там, чтобы проверить, если я получаю правильное время (который я). Я мог бы легко оставить его таким, как есть, и просто проверять его часами, погружая время в секундах на 3600, однако я просто хотел бы понять, что я делаю неправильно в TimeSpan. Я очень новичок во всем этом. Поэтому я извиняюсь, если я говорю глупо, спрашивая об этом.

Спасибо за любую помощь, которую вы можете предложить.

ответ

0

Это ожидаемое поведение счетчика, первый вызов вернет 0.0. См. Документацию по адресу https://msdn.microsoft.com/en-us/library/system.diagnostics.performancecounter.nextvalue(v=vs.110).aspx

Вы можете исправить это, добавив еще один (начальный) звонок в NextValue().

+0

спасибо. Думаю, я понял это с этой помощью. Если бы я понял это правильно, мне нужно было вызвать nextvalue один раз, прежде чем я попытался поместить его в TimeSpan. Сейчас он работает, по крайней мере, поэтому я предполагаю, что это было правильно. Еще раз спасибо. – dusty24