나는 작은 집 프로젝트로 슬롯 카 레이스 용 작은 바퀴 카운터를 쓰고있다. 카운트 다운 타이머를 구현하려면 테스트로 다음과 같이하십시오.카운트 다운 타이머/클록을보다 효율적으로 구현하는 방법은 무엇입니까?
private Thread countdownThread;
private delegate void UpdateTimer(string update);
UpdateTimer ut;
public LapCounterForm()
{
InitializeComponent();
//...
ut += updateTimer;
countdownThread = new Thread(new ThreadStart(startCountdown));
}
private void startCountdown()
{
Process.GetCurrentProcess().ProcessorAffinity = new IntPtr(1);
Process.GetCurrentProcess().PriorityClass = ProcessPriorityClass.High;
Thread.CurrentThread.Priority = ThreadPriority.AboveNormal;
System.Diagnostics.Stopwatch stopwatch = new Stopwatch();
long time = 0;
stopwatch.Start();
while (stopwatch.ElapsedMilliseconds <= 5000)
{
time = 5000 - stopwatch.ElapsedMilliseconds;
TimeSpan ts = TimeSpan.FromMilliseconds(time);
ut(ts.Minutes.ToString().PadLeft(2, '0') + ":" + ts.Seconds.ToString().PadLeft(2, '0') + ":" + ts.Milliseconds.ToString().PadLeft(3, '0'));
}
}
private void updateTimer(string text)
{
if (this.InvokeRequired)
{
this.Invoke(new Action<String>(ut), new object[] { text });
}
else
{
lblCountdownClock.Text = text;
}
}
스레드를 시작하면 작동합니다. 내가 원하는대로 5 초 카운트 다운을 얻을 수 있지만, 나는이 과정에서 많은 CPU를 사용하고 있다는 것을 알 수있다. (내 8 개 스레드의 12 %, 2600k).
는 내가 단지 UI 10 밀리 초마다 대신 밀리 초마다 업데이트하여이 부하를 많이 줄일 수 있습니다 그림,하지만 난 어떻게 TimeSpan
을하기 전에 if(time % 10 == 0)
을 사용하고 UI를 업데이트하는 것보다 다른, 등을 수행하는 아무 생각하지만 while 루프 덕택에 비효율적 일 것이라고 생각합니다.
나는 바퀴를 다시 발명합니까? 나는 가능한 한 정확하게 내 타이머를 원한다. (적어도 슬롯 머신 랩타임 기록은 UI가 자주 업데이트 될 필요가 없다.)
편집 : 의견에서 제안 된대로 실제 문자열 조작 및 UI 업데이트를 주석 처리 해 보았습니다. 이제 내 스레드를 시작할 때 스레드가 종료 될 때까지 전체 UI가 멈추고 여전히 12 %의 CPU 사용률을 갖습니다. 나는 while 루프가 많은 CPU 시간을 소비하고 있다고 생각한다.
업데이트 : 나는 Kohanz가 올린 멀티미디어 타이머 (here)와 Daniel의 대답을 함께했습니다. 나는 더 이상 다른 스레드를 전혀 사용하지 않고 타이머 객체 중 하나를 만들고 시작 버튼과 틱 이벤트를 클릭하는 사이의 시간을 계산하는 틱 이벤트 핸들러를 갖습니다. 나는 심지어 내 시원한 카운트 다운을 얻을 수 있도록 내 틱의주기를 1ms로 설정할 수 있으며, 분명히 0 % CPU를 사용하고있다. 나는 이것에 상당히 만족하고있다.
UI 업데이트를 담당하는 또 다른 스레드를 생성하여 업데이트 후 N 밀리 초 동안 절전 모드로 들어갈 수 있습니다. – OnoSendai
Timer 클래스를 본 적이 있으십니까? http://msdn.microsoft.com/en-us/library/system.windows.forms.timer.aspx .Net에 있습니까? – hatchet
내가 물어도 괜찮 으면 : 누가 10 밀리 초의 변화를 읽을 수 있습니까? 100 밀리 초나 200 밀리 초마다 충분한 업데이트가 필요하지 않습니까? 그런 다음 일반 타이머를 사용할 수도 있습니다. – Alex