gpt4 book ai didi

c# - 计时器每分钟一次

转载 作者:行者123 更新时间:2023-11-30 21:49:17 26 4
gpt4 key购买 nike

我无法让计时器在 minue,1:00、1:01、1:02 等每分钟触发一次。相反,当计时器每次迭代执行时漂移几秒钟

   internal void StartTimer()
{
DateTime nowEastern = CalendarEntity.Calendar.GetEasternTime();

int secondsInterval = 5;

double additionalSeconds = secondsInterval - nowEastern.TimeOfDay.TotalSeconds % secondsInterval;
if (additionalSeconds == 0)
{
additionalSeconds = 1;
}
var nearestOnOneMinutes = new DateTime(
nowEastern.Year,
nowEastern.Month,
nowEastern.Day,
nowEastern.Hour,
nowEastern.Minute,
nowEastern.Second
).AddSeconds(additionalSeconds);

TimeSpan timeToStart = nearestOnOneMinutes.Subtract(nowEastern);
TimeSpan tolerance = TimeSpan.FromSeconds(1);
if (timeToStart < tolerance)
{
timeToStart = TimeSpan.Zero;
}

timer_onem = new System.Threading.Timer(OnTimedEvent, null,
(int)timeToStart.TotalMilliseconds, Timeout.Infinite);
}

private static void OnTimedEvent(object o)
{
var minute = DateTime.Now.Minute;
var second = DateTime.Now.Second;
if (minute != lastMinute && second % 60 < 2)
{
lastMinute = minute;
CodeToExecute();
}
}

static void CodeToExecute()
{
double tms = 60000;

// code here
int wait = 60 - System.DateTime.Now.Second;

timer_onem.Change(Convert.ToInt64(tms) - wait, Timeout.Infinite);
}

编辑 1

我更改了间隔,使其每秒触发一次,然后检查分钟是否已更改。还是漂移

    timer_onem = new System.Threading.Timer(OnTimedEvent, null,
(int)timeToStart.TotalMilliseconds, 1000);

private static void OnTimedEvent(object o)
{
var minute = DateTime.Now.Minute;

if (minute != lastMinute)
{
lastMinute = minute;
CodeToExecute();
}
}

private static void CodeToExecute()
{
if (bGenerate)
{
double tms = 1000;
// code
timer_onem.Change(Convert.ToInt64(tms), 1000);
}
}

最佳答案

Timer保证不比Interval

所以你需要调用它,每秒说一次并检查整分钟。

为了获得更高的精度,您必须每 1/2 秒或更短时间检查一次。

信息论的一条基本规则表明,要以给定的分辨率(在您的情况下为 1 秒)进行测量,您需要以高于该分辨率两倍的分辨率进行采样。因此,要测量 20kHz,您需要一个优于 2x20kHz 的采样率,比如 44.1kHz。 (认识数字?)

如果您不想为了获得一个精确的时间点而经常调用它,您可以在每个TickTimer.Interval 重置为剩余时间的一半,直到下一个整分钟,直到低于 500 毫秒。

不过,在设置预期时间方面,您的代码中发生了相当复杂的事情;确保它们不是真正的问题。除非您“收集”错误,否则不应不会因计时器缺乏精度而导致漂移。

关于c# - 计时器每分钟一次,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37092955/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com