4

windows窗体计时器有一点问题。这是一个非常基本的问题,但我环顾四周,似乎找不到答案(我可能应该得到一记耳光)。

我需要能够获取计时器的值,它的经过时间是否大于 500 毫秒的间隔。

就像是

Timer.Elapsed >= 500
4

7 回答 7

15

Timer.Elapsed不是返回“经过的时间”的属性 - 这是您订阅的事件。这个想法是该事件每隔一段时间就会触发一次。

目前还不清楚您是否甚至想要一个Timer- 也许System.Diagnostics.Stopwatch真的是您所追求的?

var stopwatch = Stopwatch.StartNew();
// Do some work here

if (stopwatch.ElapsedMilliseconds >= 500)
{
    ...
}
于 2013-03-20T20:27:46.927 回答
4

我需要能够获取计时器的值,它的经过时间是否大于 500 毫秒的间隔。

计时器不提供允许您确定已经过去了多少时间的界面。他们唯一做的就是在过期时触发一个事件。

您需要使用其他一些机制(例如Stopwatch类)来记录时间的流逝。

于 2013-03-20T20:27:35.300 回答
2

将 Timer 的 Interval 属性设置为您想要触发的毫秒数(在您的示例中为 500),并为 Tick 事件添加一个事件处理程序。

于 2013-03-20T20:30:08.347 回答
0

我写得很快,可能有一些错误,但给你一个大致的想法

Timer timer = new System.Windows.Forms.Timer();
timer.Interval = 500;
timer.Elapsed += (s,a) => {
  MyFunction();
  timer.Stop();
}
timer.Start();
于 2013-03-20T20:38:44.540 回答
0

你不能用Timer. Elapsed是达到 0 时触发的事件。

如果您想在事件结束时收听,请注册一个 listen to ElapsedInterval是设置等待时间的成员。

见这里: http: //msdn.microsoft.com/en-us/library/system.timers.timer (v=vs.100).aspx

于 2013-03-20T20:28:14.357 回答
0

我提出了一个很简单的解决方案:

1 - 在启动计时器之前,我将当前时间存储在TotalMillisseconds(来自DateTime.Now.TimeOfDay.TotalMilliseconds):

double _startingTime = DateTime.Now.TimeOfDay.TotalMilliseconds;

2 - 每次计时器滴答作响,我都会再次获得当前时间,然后我使用一个double变量来获得这两者之间的差异:

double _currentTime = DateTime.Now.TimeOfDay.TotalMilliseconds;
double _elapsed = _currentTime - _startingTime;

if(_elapsed >= 500)
{
    MessageBox.Show("As you command, master!");
    _startingTime = _currentTime;
}

if(_currentTime < _startingTime)
    _startingTime = _currentTime;

3 - 最后,因为TotalMilliseconds将返回自 00:00(下午 12 点)以来经过的毫秒数,这意味着当它是午夜时,TotalMilliseconds将等于 0。在这种情况下,我只检查 是否_currentTime低于_startingTime,如果是这样,将 设置_startingTime_currentTime,以便我可以再次计算。

我希望这有帮助

于 2020-06-05T14:02:08.107 回答
0

根据我在这里与 David关于Stopwatchvs的讨论DateTime,我决定针对需要获得剩余时间的情况发布两种方法(非常简化),以便您决定哪一种更适合您:

public partial class FormWithStopwatch : Form
{
    private readonly Stopwatch sw = new Stopwatch();
    // Auxiliary member to avoid doing TimeSpan.FromMilliseconds repeatedly
    private TimeSpan timerSpan;

    public void TimerStart()
    {
        timerSpan = TimeSpan.FromMilliseconds(timer.Interval);
        timer.Start();
        sw.Restart();
    }

    public TimeSpan GetRemaining()
    {
        return timerSpan - sw.Elapsed;
    }

    private void timer_Tick(object sender, EventArgs e)
    {
        // Do your thing
        sw.Restart();
    }
}

public partial class FormWithDateTime : Form
{
    private DateTime timerEnd;

    public void TimerStart()
    {
        timerEnd = DateTime.Now.AddMilliseconds(timer.Interval);
        timer.Start();
    }

    public TimeSpan GetRemaining()
    {
        return timerEnd - DateTime.Now;
    }

    private void timer_Tick(object sender, EventArgs e)
    {
        // Do your thing
        timerEnd = DateTime.Now.AddMilliseconds(timer.Interval);
    }
}

老实说,我没有看到使用Stopwatch. 实际上,使用DateTime. 此外,后者对我来说似乎更清楚一点。

于 2019-12-23T16:47:30.037 回答