【问题标题】:C# Countdown Accumulation TimerC# 倒数累加定时器
【发布时间】:2012-06-25 21:06:02
【问题描述】:

我有一个应用程序,我将在其中显示计时器。

用户将执行一个事件并应在一定时间内完成它。 我目前有一个计时器,可以显示他们的时间滴答作响,但我现在想要的是总累积时间。因此,每次新事件开始时,完成事件的时间都会添加到它们的累积时间中。然后,当他们执行事件时,时间会在累积的时间上打勾。

这就是我的“当前计时器”

u.StartingTime = u.ChangeOverStandard;
u.CurrentChangeOverTime = u.StartingTime - (DateTime.Now - u.ChangeOverStart);

所有这些字段都是时间跨度。这非常适合他们的“当前”计时器

但我需要一个“总”计时器,它要么显示正的时间跨度值……如果它们在他们应该完成之前完成……或者如果它们花费的时间太长,则显示负的时间跨度值。

编辑:

所以我想实现这个:

例如:对于“事件 1”,用户有 30 秒。结束。然后用户有一个“TotalTimespan”属性= 30。这个总数随着事件计时器而减少。假设他在 24 秒内完成。这意味着他在 TotalTimespan 中还剩 6 秒。然后“event2”必须在 40 秒内完成。所以在 event2 开始时,TotalTimespan = TotalTimespan(6) + 40. = 46。如果用户使用 60 秒,那么 TotalTimespan = 46 -60 = -14。

“定时器”不是定时器,不能用作定时器。它在后台工作人员上运行,后台工作人员也在进行其他一些计算。所以我不能一秒一秒地取消时间。

在每个新活动中,我都尝试过

u.AccumulatedTime += u.ChangeOverStandard;

然后

u.AccumulatedTime -= u.StartingTime - (DateTime.Now - u.ChangeOverStart);

但这显然行不通,因为它通过我的循环从每一轮的累积时间中花费总经过的时间

DateTime.Now - u.ChangeOverStart

^^会给我从活动开始到现在经过的时间,这就是我想要的吗?

u.AccumulatedTime -= DateTime.Now - u.ChangeOverStart;

【问题讨论】:

  • 我不知道如何计算总数。我知道它必须很简单,只是想不通。我需要一个总计..所以每次我将我的“标准”添加到总计中并倒计时直到用户完成
  • 嗯,问题是......你想要达到什么。例如:对于“事件 1”,用户有 30 秒。结束。然后用户有一个“TotalTimespan”属性= 30。这个总数随着事件计时器而减少。假设他在 24 秒内完成。这意味着他在 TotalTimespan 中还剩 6 秒。然后“event2”必须在 40 秒内完成。所以在 event2 开始时,TotalTimespan = TotalTimespan(6) + 40. = 46。如果用户使用 60 秒,那么 TotalTimespan = 46 -60 = -14。我明白了吗?
  • 顺便说一下,你可以多写一点代码,也许……
  • 完全正确。我不想发布很多代码,因为我知道这会引起混乱..我会编辑我的帖子

标签: c# timer countdown


【解决方案1】:

您只需要一个 TimeSpan 和两个 DateTime 静态(全局)变量来跟踪时间并进行计算。这是使用您描述的数字的示例:

        TimeSpan left = new TimeSpan(0, 0, 30);  //30 seconds allowed for task.
        DateTime start = DateTime.UtcNow;
        //User perform action.
        System.Threading.Thread.Sleep(24000); //24 sec wait.
        DateTime stop = DateTime.UtcNow;
        left = left - (stop - start);
        Console.WriteLine(Math.Ceiling((double)left.TotalSeconds));
        //Output was: 6
        left = left + new TimeSpan(0, 0, 40);  //40 seconds allowed for task.
        start = DateTime.UtcNow;
        //User perform action.
        System.Threading.Thread.Sleep(60000); //60 sec wait.
        stop = DateTime.UtcNow;
        left = left - (stop - start);
        Console.WriteLine(Math.Ceiling((double)left.TotalSeconds));
        //Output was: -14
        left = left + new TimeSpan(0, 0, 30);  //30 seconds allowed for task.
        Console.WriteLine(Math.Ceiling((double)left.TotalSeconds));
        //Output was: 16

如你所见,最后的剩余时间是你所期望的 16 秒。

【讨论】:

  • 科尼利厄斯,请务必查看有关问题的日期。您刚刚“回答”了 2012 年的一个问题。原作者最后一次出现是在 2017 年...
  • @Idle_Mind 我们当然不想不回答老问题,对吗?如果是这种情况,那么应该删除旧的、未回答的问题。仅仅因为提问者可能找到了解决方法并不意味着其他人不会从提供的答案中受益。
猜你喜欢
  • 2011-12-19
  • 1970-01-01
  • 1970-01-01
  • 2021-02-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多