2011-07-15 77 views
3

我做了一個迷宮遊戲。我需要一個滴答定時器。我試圖創建一個這樣的類:如何使用System.Threading.Timer和Thread.Sleep?

using System; 
using System.Threading; 

namespace Maze 
{ 
    class Countdown 
    { 
     public void Start() 
     { 
      Thread.Sleep(3000);    
      Environment.Exit(1); 
     } 
    } 
} 

並在代碼開始時調用Start()方法。運行後,我試圖將頭像移動到失敗的迷宮中。如果我沒有弄錯,Thread.Sleep會讓我的其他代碼不再工作。如果有辦法,我可以做其他事情,請告訴我。

+0

你能告訴我們更多的代碼,例如你如何設置更新和繪製循環? – TJHeuvel

+0

是滴答定時器,用於控制玩家通過迷宮玩了多少時間? – nbz

+0

@Reinan - 您所有的代碼都會將調用線程(您的應用程序)置於睡眠狀態3秒鐘。你需要一個獨立的線程,讓它進入睡眠狀態,等待它醒來,然後再做任何事情。只需使用Timer類。 –

回答

1

您正在尋找Timer類。

+0

? Timer timer = new Timer(new TimerCallback(TimeCallBack),null,1000,50000); –

1

爲什麼不使用已經包含在BCL中的Timer類之一?

Here是不同的人(MSDN雜誌 - 比較.NET Framework類庫中定時器類)的比較。閱讀它,看看哪一個將最適合您的具體情況。

+0

我真的不明白如何使用Start()Stop()方法。它是否已經內置?像Read()和Write()?或者我仍然需要創建自己的方法Start()? –

+0

@Reinan Contawi - 你讀過鏈接的文章了嗎?它有例子。所有計時器都使用_events_來觸發。 – Oded

+0

僅適用於Form Applications?我使用控制檯應用程序btw。 –

2

當前的代碼是不工作的原因是調用Thread.Sleep()停止當前線程上的任何執行,直到給出的時間已過。所以,如果你Countdown.Start()在遊戲主線程(我猜你正在做的),你遊戲將凍結,直到Sleep()調用完成。


相反,你需要使用System.Timers.Timer

看一看的MSDN documentation

UPDATE:現在希望更符合您的方案

public class Timer1 
{ 
    private int timeRemaining; 

    public static void Main() 
    { 
     timeRemaining = 120; // Give the player 120 seconds 

     System.Timers.Timer aTimer = new System.Timers.Timer(); 

     // Method which will be called once the timer has elapsed 
     aTimer.Elapsed + =new ElapsedEventHandler(OnTimedEvent); 

     // Set the Interval to 3 seconds. 
     aTimer.Interval = 3000; 

     // Tell the timer to auto-repeat each 3 seconds 
     aTimer.AutoReset = true; 

     // Start the timer counting down 
     aTimer.Enabled = true; 

     // This will get called immediately (before the timer has counted down) 
     Game.StartPlaying(); 
    } 

    // Specify what you want to happen when the Elapsed event is raised. 
    private static void OnTimedEvent(object source, ElapsedEventArgs e) 
    { 
     // Timer has finished! 
     timeRemaining -= 3; // Take 3 seconds off the time remaining 

     // Tell the player how much time they've got left 
     UpdateGameWithTimeLeft(timeRemaining); 
    } 
} 
+0

什麼是OnTimedEvent?它會在3秒後退出程序嗎? –

+0

一旦定時器的時間間隔過去,無論你放在'OnTimedEvent'中什麼都會執行。換句話說,你告訴C#'在3000ms之後運行這個代碼已經被淘汰了'。 設置'aTimer.Enabled = true'是實際啓動定時器倒計時的行。 –

+0

抱歉,您必須有錯誤的想法,因爲我的解釋並不那麼簡潔。我使用的代碼只是一個嘗試。我知道它會失敗,我只是想學習這個概念。我想要發生的事情是我在3秒內做了其他事情。 –

0

除了@Slaks resposnse可以說,你可以使用:

  1. System.Windows.Forms.Timer這是計時器在同一個線程在那裏停留UI
  2. System.Timers.Timer這是一個計時器,但在另一個線程上運行。

選擇是由你,取決於你的應用程序架構。

問候。

+1

如果您不斷與UI進行交互,那麼在另一個線程中運行計時器可能更有利。 – nbz

+0

同意@nEM,但最終desicion只有你自己@Reinan。 – Tigran

+0

幫助我從頂部,所以我可以得到的概念。我是一名快速學習者,我只需要從頂端獲得它。首先,我的附加頭文件是否正確? System.Threading; System.Timers; –