gpt4 book ai didi

objective-c - 如何确保我的计时器运行没有竞赛

转载 作者:行者123 更新时间:2023-12-03 17:08:56 25 4
gpt4 key购买 nike

这不是实际代码,仅提供实际代码中逻辑背后的想法。我需要在计时器函数内使用互斥体 mylock2 吗?计时器每 0.02 秒运行一次。或者,计时器在这方面是安全的?

Static NSTimer *mylock1 = nil;  //initialized and used for another purpose
Static NSTimer *mylock2 = nil //initialized and used for the timer



- (void)timerFireMethod:(NSTimer*)theTimer
{
[mylock2 lock];
Self.Mycount = 0;
for (int j = 0; j <n; j++)
{
if (b) NSLog(@”Hi”);
else Self.Mycount = Self.Mycount + 1;
}
If (Self.Mycount == n)
[self stopMytimer];

[mylock2 unlock];
}

最佳答案

您可能误解了 NSTimer 的工作原理。

NSTimer 调用由运行循环处理,当调度计时器时,它会附加到当前运行循环。毫不奇怪,运行循环是一个循环并且在单个线程上运行。运行循环的每次迭代都会检查是否需要触发任何计时器,如果是,则调用它,因此在该调用返回之前,运行循环将执行的下一个操作不会发生......

the timer uses scheduledTimerWithTimeInterval. if the timer gets fired every 0.02 sec, how to void overlapping timer calls?

在正常情况下,调用根本无法重叠,因为在当前调用返回之前,下一个调用不会发生。

当然,如果您将工作异步分派(dispatch)到计时器内的另一个线程,从计时器内启动另一个运行循环并在该计时器上安排计时器,或者您想出的任何其他创造性方式,则可以创建“重叠”调用的条件。您的 timerFireMethod: 没有执行任何类似操作,只会被调用、执行和返回。

does "Self.Mycount" become 0 in middle of the for loop execution causing unexpected behaviors?

可能 - 因为您的方法不是为该场景设计的。但除非你启动另一个线程(使用 NSThread、GCD(调度)等),并将其设置 Mycount 为零,否则这种情况不会发生。

HTH

关于objective-c - 如何确保我的计时器运行没有竞赛,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58468210/

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