2015-04-28 1 views
0

Как цифровые часы с часами минут секунд и миллисекунд 00: 00: 00: 00 Это класс я есть сейчас:Как добавить метод, который будет подсчитывать время выполнения программы?

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 

namespace Capture.Hook 
{ 
    public class FramesPerSecond 
    { 
     int _frames = 0; 
     int _lastTickCount = 0; 
     float _lastFrameRate = 0; 

     public void Frame() 
     { 
      _frames++; 
      if (Math.Abs(Environment.TickCount - _lastTickCount) > 1000) 
      { 
       _lastFrameRate = (float)_frames * 1000/Math.Abs(Environment.TickCount - _lastTickCount); 
       _lastTickCount = Environment.TickCount; 
       _frames = 0; 
      } 
     } 

     public float GetFPS() 
     { 
      return _lastFrameRate; 
     } 
    } 
} 

И я использую его, как это в другом классе:

if (this.FPS.GetFPS() >= 1) 
         { 
          font.DrawText(null, String.Format("{0:N0} fps", this.FPS.GetFPS()), 5, 5, SharpDX.Color.Red); 
          font.DrawText(null, String.Format("{0:N0} fps", this.FPS.GetFPS()), 5, 5, SharpDX.Color.Red); 
         } 

что я хочу, что во второй строке:

font.DrawText(null, String.Format("{0:N0} fps", this.FPS.GetFPS()), 5, 5, SharpDX.Color.Red); 

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

Как я могу сделать метод и как его отобразить с помощью font.DrawText?

Что я пытался до сих пор в классе FramesPerSecond я добавил:

static DateTime _startTime = DateTime.Now; 

Затем добавил:

public static TimeSpan RunTime 
     { 
      get 
      { 
       return DateTime.Now - _startTime; 
      } 
     } 

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

string timeRunning = FramesPerSecond.RunTime.ToString("hh:mm:ss:ff"); 

И я получаю исключение в этой строке: string timeRunning = FramesPerSecond.RunTime.ToString ("hh: mm: ss: ff");

Error: Error in InitialiseHook: System.FormatException: Input string was not in a correct format. 
    at System.Globalization.TimeSpanFormat.FormatCustomized(TimeSpan value, String format, DateTimeFormatInfo dtfi) 
    at System.Globalization.TimeSpanFormat.Format(TimeSpan value, String format, IFormatProvider formatProvider) 
    at System.TimeSpan.ToString(String format) 
+0

Является ли «временным часом» текущее системное время, время работы игры, какое-то заданное время и т. Д.? –

+0

Рон «Время» - это время игры. Поскольку игра находится в полноэкранном режиме directx, я должен использовать ее так же, как и в drawtext текста шрифта, и в той же идее GetFPS. Мне нужен только таймер или что-то в этом роде и показать его так же, как я отобразил GetFPS с шрифтом.DrawText – user1196715

ответ

1
public class FramesPerSecond 
{ 
    int _frames = 0; 
    int _lastTickCount = 0; 
    float _lastFrameRate = 0; 
    DateTime _startTime = DateTime.Now; 

    public Timespan RunTime 
    { 
     get 
     { 
      return DateTime.Now - _startTime; 
     } 
    } 

    public void Frame() 
    { 
     _frames++; 
     if (Math.Abs(Environment.TickCount - _lastTickCount) > 1000) 
     { 
      _lastFrameRate = (float)_frames * 1000/Math.Abs(Environment.TickCount - _lastTickCount); 
      _lastTickCount = Environment.TickCount; 
      _frames = 0; 
     } 
    } 

    public float GetFPS() 
    { 
     return _lastFrameRate; 
    } 
} 

Просто добавьте DateTime и отслеживать между вызовами, чтобы использовать его, вам просто нужно использовать что-то вроде этого:

string timeRunning = FPS.RunTime.ToString(@"hh\:mm\:ss\:ff"); 

А потом сделать что везде, где вы хотите.

+0

Ron я получаю ошибку исключения в строке: string timeRunning = FramesPerSecond.RunTime.ToString ("hh: мм: сс: FF "); Исключение составляет: Ошибка: Ошибка в InitialiseHook: System.FormatException: строка ввода не была в правильном формате. в System.Globalization.TimeSpanFormat.FormatCustomized (значение TimeSpan, формат строки, DateTimeFormatInfo dtfi) на System.Globalization.TimeSpanFormat.Format (значение TimeSpan, формат String, IFormatProvider formatProvider) в System.TimeSpan.ToString (формат String) в Capture.Hook.DXHookD3D9 .. ctor (CaptureInterface ssInterface) – user1196715

+0

Попробуйте его без «hh: mm: ss: ff» там, он не должен жаловаться, но это в значительной степени стандартная реализация ToString по умолчанию. просто используйте 'FPS.RunTime.ToString()' –

+0

Возможно, вам придется сбежать: 's, это тоже должно работать: 'FPS.RunTime.ToString (@" hh \: mm \: ss \: ff ");' Извините, я отредактирую сообщение. –

2

Если вы хотите, чтобы отобразить постоянно обновляя текст с инкрементным таймером, отметив, истекшее время, как я обнаружил, что лучше всего работает для меня, чтобы добавить класс Timer формы для Windows в форму, начать Stopwatch (используя System.Diagnostics) и прикрепить метод таймера Tick событие, чтобы обновить этикетку или любой другой текст для часов проводится в.

// Don't forget the using in your imports and such 
using System.Diagnostics; 

Stopwatch stopwatch = new Stopwatch(); 

public void CheckTime() 
{ 
    label1.Text = stopwatch.Elapsed.ToString("hh\\:mm\\:ss\\:ff"); 
} 

public void timer1_Tick(object sender, EventArgs e) 
{ 
    CheckTime(); 
} 

по умолчанию, я считаю, что таймер имеет интервал 100. Если вы хотите, чтобы он обновлялся чаще, чем я бы рекомендовал. 10.

timer1.Interval = 10;

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