2013-06-19 35 views
0

我有一個關於.net框架中的Stopwatch類的問題。我想衡量(在遊戲時間)循環重複,需要的時間秒錶:測量時間並立即重新啓動,無競賽狀況

Stopwatch timer = new Stopwatch(); 
timer.Start(); // Edited this in, forgot about that 
while(true) 
{ 
    var timespan = timer.Elapsed; 
    timer.Restart(); 
    // do something with the timespan 

    // Do some work here 
} 

我擔心的是,測量和重啓上下文切換可能發生,一些「時間」之間會丟失。 有沒有人知道以原子方式測量和重啓計時器的方法?

編輯:沒有秒錶的解決方案,也歡迎

+1

把timer.start放在上面的while循環中,timer.stop在bellow中,並且創建時間跨度變量= timer.Ellapsed,如果它要記錄while循環時間。 – terrybozzio

+0

我不想測量整個while循環,但只是每次迭代。這用於遊戲循環,並且可能不重要的是「上下文切換時間」不在其中。這只是我希望儘可能精確。想一想:如果我的線程優先級低,並且高優先級的線程啓動,並且我的低優先級在2分鐘內沒有任何cpu循環或者什麼東西(剛剛編譯:),那該怎麼辦)。這會影響很多測量。 – Nogiax

回答

0

您不必重新啓動定時器。你可以記住變量中最後一次測量的Elapsed,然後總是採取差異。喜歡的東西(你也必須採取的第一個迭代的護理):

Stopwatch timer = new Stopwatch(); 
var lastElapsed = timer.Elapsed; 
while(true) 
{ 
    var newLastElapsed = timer.Elapsed; 
    var timespan = newLastElapsed - lastElapsed; 
    lastElapsed = newLastElapsed; 
    // do something with the timespan 

    // Do some work here 
} 

但是,爲什麼你關心一些時間考慮消逝的測量和重啓定時器之間經過?你是否對僅測量「在這裏做某些工作」部分感興趣或者還在測量「按時間做某件事」部分?

+0

我也來到這個解決方案。我想要做的是實際上模擬一個計時器。我將每次迭代的時間添加到另一個時間段,並且當這個時間跨度超過某個閾值時,會啓動一個方法。在我的情況下,這是一個具有固定時間步的遊戲循環,可以在不同的時間間隔觸發更新和繪製 – Nogiax

0
Stopwatch timer = new Stopwatch(); 
timer.Start(); 
var previous = timer.elapsed; 
while(!done) 
{ 
    var current = timer.Elapsed; 
    var elapsed = current - previous; 
    previous = current; 
    // use elapsed 
    // do the rest of your work 
} 

對不起格式化,我在真正的電腦上修復它。