gpt4 book ai didi

cocoa - NSTimer - 设置普通 Vanilla - 不触发

转载 作者:行者123 更新时间:2023-12-03 16:55:38 24 4
gpt4 key购买 nike

在 XCode 3.1.1 中针对 OSX 10.5.8 目标、32 位和 i386 版本进行编译。

我有一个模态运行循环,在 NSWindow wloop 和 NSView vloop 中运行。首先启动模态循环。它按预期启动、运行和停止。这是开始:

[NSApp runModalForWindow: wloop];

然后,当用户按下鼠标左键时,我会执行以下操作:

if (ticking == 0) // ticking is set to zero in its definition, so starts that way
{
ticking = 1; // don't want to do this more than once per loop
tickCounter = 0;
cuckCoo = [NSTimer scheduledTimerWithTimeInterval: 1.0f / 10.0f // 10x per second
target: self // method is here in masterView
selector: @selector(onTick:) // method
userInfo: nil // not used
repeats: YES]; // should repeat
}

检查调用的返回,我确实获得了一个计时器对象,并且可以确认计时器调用是在我期望的时间进行的。

现在,根据文档,生成的 NSTimer(全局存储为“cuckCoo”)应该自动添加到当前运行循环中。当前的运行循环绝对是模式循环 - 此时其他窗口被锁定,只有具有预期鼠标操作的窗口正在接收消息。

这个调用的方法“onTick”非常简单(因为我无法让它触发),位于 vloop NSView 代码中,这就是所有这些发生的地方:

- (void) onTick:(NSTimer*)theTimer
{
tickCounter += 1;
NSLog(@"Timer started");
}

然后,当需要停止模态循环时(顺便说一句,效果很好),我会这样做:

[cuckCoo invalidate];
[NSApp stop: nil];
ticking=0;
cuckCoo = NULL;
NSLog(@"tickCounter=%ld",tickCounter);

ticking 和tickCounter 都是全局多头。

我没有从 onTick 中获取 NSLog 消息,并且在运行循环结束时按照 NSLog 的报告,tickCounter 保持为零。

所有这些都编译并运行良好。我只是从来没有得到任何蜱虫。我完全不知所措。大家有什么想法吗?

最佳答案

问题与“当前运行循环绝对是模态循环”这句话有关。在Cocoa中,每个线程最多有一个runloop,并且每个runloop可以以多种“模式”运行。典型的模式有默认模式、事件跟踪模式和模态模式。默认是循环通常运行的模式,而事件跟踪通常用于跟踪鼠标的拖动 session ,而模态则用于模态面板等内容。

当您调用 -[NSTimerchedTimerWithTimeInterval:target:selector:userInfo:repeats:] 时,它会立即调度计时器,但它仅将其调度为默认运行循环模式,而不是模态运行循环模式。其背后的想法是应用程序通常不应继续在模式面板后面运行。

要创建在模式运行循环期间触发的计时器,可以使用 -[NSTimer initWithFireDate:interval:target:selector:userInfo:repeats:] ,然后使用 -[NSRunLoop addTimer:forMode:]。

关于cocoa - NSTimer - 设置普通 Vanilla - 不触发,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5395792/

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