2011-07-17 83 views
4

我有一个迷宫游戏。按Enter键后,您可以输入作弊码,同时,计时器将暂停。但是在输入代码后,我的计时器恢复,但它每秒递减3倍。下面是按条件输入:问题在暂停/恢复定时器

// gt.setTimer() is called at the moment the maze started 
// I'm using getch to trap inputs 

else if (move == 13) //Reads if Enter is pressed 
      { 
       pause = 1; //A Flag saying that the timer must be paused 
       gt.setTimer(pause); //Calls my setTimer() method 
       Console.Write("Enter Cheat: "); 
       cheat = Console.ReadLine(); 
       pause = 0; //A Flag saying that the timer should resume 
       gt.setTimer(lives, pause); //Calls again the Timer 
      } 

这里是我的SetTimer()代码:

static System.Timers.Timer t = new System.Timers.Timer(); 
static int gTime = 300; 

public void setTimer(int pause) 
    { 
     t.Interval = 1000; // Writes the time after every 1 sec 
     if (pause == 1) 
      t.Stop(); // Stop the timer if you press Enter 
     else 
      t.Start(); // Starts the timer if not 
     t.Elapsed += new ElapsedEventHandler(showTimer);      
    } 

    public static void showTimer(object source, ElapsedEventArgs e) 
    { 
     Console.Write("Time " + gTime); //Writes time 
     gTime--; //Decrements the time 
    } 

有什么错吗?我错过了什么吗?

+0

为什么暂停一个int,而不是一个布尔值? – CodesInChaos

+0

你的同步代码在哪里?您正在使用没有同步的多线程。海事组织你不应该在这里使用多线程。 – CodesInChaos

回答

2

每当你这样做时: t.Elapsed + = new ElapsedEventHandler(showTimer); 您多一个事件处理程序添加到该事件

这strind乳宁只有一次,在参数代码,你初始化定时器

+0

嗯我该如何解决这个问题?我真的需要不时地调用这个方法。 –

+1

尝试做t.Elapsed - = new ElapsedEventHandler(showTimer); before t.Elapsed + = new ElapsedEventHandler(showTimer); –

+0

但是如果你在类构造函数 –

5

问题出在setTimer方法的最后一行。计时器处理程序应在调用构造函数后注册一次,而不是在setTimer中注册。在经过的计时器事件中,处理程序被称为它已被注册的次数。因此,你使用的运算符越多=它被调用的次数就越多。

+0

嗯,我应该如何解决这个问题?我真的需要不时地调用这个方法。 –

+0

我将如何替换elapse计时器事件? –

+1

@Reinan您可以使用 - =,在setTimer方法的开始处取消订阅事件,就像您使用+ =订阅一样。或者您可以创建计时器并从代码的其他部分订阅该计时器,然后只在要开始计数时启动计时器。 –