gpt4 book ai didi

cocoa - 运行循环不处理事件

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

我正在标准(由 XCode 创建)应用程序中使用运行循环进行测试。我的应用程序有 2 个按钮:

  1. Start Loop - 以某种模式启动 runloop(参见下面的代码);
  2. Stop Loop - 更改 self.stop 标志以停止 runloop。

`

- (IBAction)stopLoop:(id)sender
{
self.stop = YES;
}

- (IBAction)startLoop:(id)sender
{
self.stop = NO;
do
{
[[NSRunLoop currentRunLoop] runMode:runLoopMode beforeDate:runLoopLimitDate];
if (self.stop)
{
break;
}
} while (YES);
}

`

地点:
1. runLoopMode 是预定义模式之一(我尝试了每种模式、默认模式、事件跟踪模式、模态模式、连接模式)。
2. runLoopLimitDate [NSDate distanceFuture],或 [NSDate distancePast],或关闭功能。
3. self.stop 标志安装在其他方法中,通过按钮调用。

仅此而已,我的应用程序没有任何其他代码。

AFAIU,runloop模式是一组事件源。因此,如果我在某种模式下运行 runloop,runloop 将继续处理与该模式关联的事件源。
默认情况下,Cocoa 在默认模式下运行 runloop,所有事件都会顺利进行。但是当用户按下 startLoop 按钮时,我的应用程序卡住:
freezed app
startLoop 方法永远不会打破这个无限循环。应用程序不会向我发送任何事件,因此 UI 卡住并且用户无法按 stopLoop 按钮。如果我运行 Core Foundation 对应版本,也会出现同样的问题。

但是,当我尝试通过 NSApplication (NSWindow)方法 nextEventMatchingMask:untilDate:inMode:dequeue: 接收事件并传递 same 模式时,我收到 UI 事件。

- (IBAction)startLoop:(id)sender
{
self.stop = NO;
do
{
NSEvent *event = [NSApp nextEventMatchingMask:NSAnyEventMask untilDate:nil inMode:NSEventTrackingRunLoopMode dequeue:YES];
if (event == nil)
{
break;
}
[NSApp sendEvent:event];
if (self.stop)
{
break;
}
} while (YES);
}

有个问题:“为什么如果我运行默认的运行循环模式或其他模式,这样我就无法接收事件?”
感谢您的建议。

最佳答案

您假设在 NSDefaultRunMode 中运行 NSRunLoop 处理用户输入事件,例如按键或鼠标单击。我认为情况并非如此。

NSApplication 使用 nextEventMatchingMask:untilDate:inMode:dequeue: 从事件中获取事件。通过像这样运行运行循环,您并没有真正获取事件队列的任何事件。

云你尝试这样的事情:

- (IBAction)startLoop:(id)sender
{
do
{
NSEvent *event = [NSApp nextEventMatchingMask:NSAnyEventMask];
[NSApp sendEvent:event];

if (self.stop)
{
break;
}
} while (YES);
}

(尚未测试过)。

关于cocoa - 运行循环不处理事件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22068477/

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