2014-12-22 31 views
0

我有一個間隔爲1000毫秒的計時器。我想在隨機時間內但在給定的時間範圍內做某件事。例如。如果我指定時間範圍爲例如10秒,1-10,11-20,21-30等等。這意味着,在第一個10秒內,在第一個時間幀1到10秒之間隨機發生一些事情。例如。可能發生在第二秒或第八秒。然後在第二個時間段之間再次從11秒到20秒再次發生任何事情。例如。這可能是第13或第15秒。請注意,計時器必須是連續的,例如,從1到100秒。在這裏,如果我指定時間框架爲10,那麼我們將有10個時間框架。 1-10,11-20,21-30 .... 91-100。因爲我需要知道將要發生的事件的確切時間。因此,不要認爲重置計時器可能會解決問題。在特定的時間範圍內隨意地做點什麼

感謝您的答覆和解釋的例子,非常感謝。

回答

0

你的問題不是很清楚,所以讓我假設東西這將發生函數。假設[010]中發生func1,[11-20]中發生func2等等。

  • 執行稱爲random的函數,其輸出bool(判斷是否執行)。
  • 爲時間間隔的每個區間定義一組標誌以跟蹤我們是否已經在此期間執行了指定的功能(flag1,flag2,...)。
  • 設置你的timer.Interval 1秒
  • 定義一個全局變量(count),並通過各1個timer.tick增加它
  • 使用的一些條件在這裏:

    if(count>0 && count<=10) 
    { 
        if(flag1 && random()) {func1(); flag1=false;} 
    } 
    
    if(count>10 && count<=20) 
    { 
        if(flag2 && random()) {func2(); flag2=false;} 
    } 
    

等等

0

只需跟蹤每個幀的實際偏移量,並在生成新事件時間時考慮到這一點:

void RunEvents(TimeSpan interval, TimeSpan duration) 
{ 
    Random random = new Random(); 
    TimeSpan eventOffset = new TimeSpan(); 
    Stopwatch sw = Stopwatch.StartNew(); 

    while (sw.Elapsed < duration) 
    { 
     TimeSpan nextEvent = eventOffset + 
      TimeSpan.FromSeconds(random.NextDouble() * interval.TotalSeconds); 

     TimeSpan delay = nextEvent - sw.Elapsed; 

     if (delay.Ticks > 0) 
     { 
      Thread.Sleep(delay); 
     } 

     eventOffset += interval; 
    } 
} 

換句話說,通過將在先前間隔遺留先前事件到當前間隔的開始時間之後的時間,隨着時間的實際間隔內的隨機長度沿着計算nextEvent

然後,等待現在和下一個事件之間的足夠時間。

最後,更新偏移和間隔餘數,以便它們可用於下一輪。

注:

  1. 上述假設你用定時器本身完全免除,並用上述代替。如果這不合適,那麼你應該更具體地說明計時器本身應該如何與你隨機生成的事件相關聯。
  2. 編輯:我有一個含糊的意義,我可以合併eventOffsetsincePrevious到一個單一的值。但在這裏已經很晚了,我認爲這很容易留給讀者作爲練習。 :)我終於明白了爲什麼這是在擾亂我:我根本不需要上面的sincePrevious!嘆。代碼已被編輯以糾正我的錯誤。
  3. 以上用途Thread.Sleep()爲延遲。恕我直言,最好是使方法async和使用Task.Delay()來代替。但是我想保持這個例子簡單,並且無法從問題中得知問什麼是處理延遲本身的最佳方法。
0

我不認爲前3個答案中有任何答案是正確的,所以讓我試試看:你說的是時間在滴答滴答,並且在N秒的每一片中,你想要發生一個事件在該片段的隨機時間。如果是這種情況,那麼只要時間是N秒的倍數,就得到一個介於0到N之間的隨機數,並在那個時間生成事件。例如,在僞碼:

time = 0 
delta_time = 1 second 
max_time = 100 seconds 
slice_time = 10 seconds 
// decide when event of first slice will occur; can't be at 0: get random # 
// in range [delta_time, slice_time]: 
next_rand_time = random(delta_time, slice_time) 
setup timer to fire at interval of delta_time, each time do the following (callback): 
    time += delta_time 
    // is it time to fire the event yet? allow for round-off error: 
    if abs(time - next_rand_time) < 0.0001: 
     generate event 
    // is it time to decide when next random event will be? 
    if modulo(time, slice_time) == 0: 
     // can't be on left boundary; get random # in range [delta_time, slice_time]: 
     next_rand_time = time + random(delta_time, slice_time) 

的5個變量(時間,delta_time等)有可能會成爲使用該計時器類的數據成員,以及回調將是類的一個方法。在您的文章中提供一些代碼以獲取更多詳情。

相關問題