【问题标题】:Timer is working strangely, how to fix定时器工作异常,如何解决
【发布时间】:2015-12-08 21:51:11
【问题描述】:

我正在制作电子游戏,特别是现在我想制作伪动画门。

我的意思是,当我的游戏中的门被使用时,它的图像应该从“关闭”变为“打开”,然后游戏必须等待大约半秒,然后才应该加载另一个区域。 问题是,该计时器实际上并没有等待所需的时间,或者至少并不总是这样做。有时它会像预期的那样持续 500 毫秒,有时会持续更短的时间。

我正在使用以下代码:

当使用门时

            imgLockerRoomOpenDoor.Visibility = Visibility.Visible;

            tmrDoorOpening.Tick += new EventHandler(tmrLockerRoomDoorOpening);
            tmrDoorOpening.Interval = new TimeSpan(0, 0, 0, 0, 500);
            tmrDoorOpening.Start();    

“tmrLockerRoomDoorOpening”代码:

        tmrDoorOpening.Stop();

        AreaTransition();
        areaHibernation1.Visibility = Visibility.Visible;
        areaHibernation1.IsEnabled = true;
        areaHibernation1.Margin = new Thickness(55, 31, 0, 0);
        ActionsReset();

定时器声明:

    public static System.Windows.Threading.DispatcherTimer tmrDoorOpening = new System.Windows.Threading.DispatcherTimer();

AreaTransition 用于隐藏所有游戏区域,所以不要认为它相关。

为什么定时器的工作时间不同?我怎样才能将其设置为相同?

我举个例子。 有两个房间。

1) 我在 1 号房间。

2) 我点击门。

3) 门图像变为打开,程序等待 1/2 分钟,然后房间 1 消失,我出现在房间 2。

4) 我回到房间 1。门已关闭图像。

5) 我再次点击门,但现在打开的门出现的时间较短。

【问题讨论】:

  • 你试过不同的定时器吗?就个人而言,我会尝试System.Timers.Timer 并利用“一次性”功能。此计时器只能触发一次,因此您不必担心真正停止/重新启动。它也是一个线程计时器。
  • 你说这个计时器是一次性的。如果我想重复该操作,我可以重置它吗?我不希望它自动重复,但我确实希望在需要时重复它。
  • 启动“正常”计时器,当事件触发时,您显式地停止它,然后在需要时重新启动它。 System.Timers.Timer 有一个 AutoReset 属性。如果将其设置为false,则计时器将在事件触发时自动停止,您不必明确停止。当然你可以随时重新开始!
  • 你应该小心你调用tmrDoorOpening.Tick += new EventHandler(tmrLockerRoomDoorOpening);的地方确保你每次点击门时不要添加一个新的处理程序。记住你做了计时器static。在这种情况下,我个人不会在表格上做的事情。你在重用窗口/页面吗?
  • @Dbuggy 你说得对——我什至没有看到计时器被声明为static。每当一扇门被击中时,我都会创建一个新的计时器实例,并将“门实例”传递给计时器,以便计时器知道要处理哪扇门。

标签: c# wpf timer


【解决方案1】:

我看到你使用 tmrDoorOpening.Stop();

所以自从你停止计时器后,它就不能一直是 500?

它将执行 500 + stop()> work > start() 之间的时间

【讨论】:

  • 好吧,OP 抱怨计时器间隔比预期的 500 毫秒。由于他仅在计时器事件中使用Stop(),因此停止不会缩短间隔。他没有抱怨计时器没有在恰好 500 毫秒时重复触发,这可以通过您答案的最后一行来解释。他基本上想要一个在 500 毫秒后触发的一次性计时器。所以不,这不能回答问题。
  • 那么,我需要添加一行重新启动它吗?
  • @EvgenieT 不,我认为 Zwan 误解了你的问题。
  • 更新了原始帖子以提供更多详细信息。
  • 哎呀,这是评论而不是答案。通过代码,我没有得到一个计时器可以给出比他设置的更短的结果,从 start() 开始,在任何情况下对我来说都是 500 毫秒,只有 stop() 可以缩短这个延迟。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-09-15
  • 2017-09-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多