gpt4 book ai didi

macos - 从后台线程泵送 Cocoa 消息循环

转载 作者:行者123 更新时间:2023-12-03 16:18:57 25 4
gpt4 key购买 nike

我有一个基于 Cocoa 的命令行应用程序,它以编程方式创建 NSWindow + NSView。它使用 nextEventMatchingMask 循环来手动泵送事件循环并分派(dispatch)事件。该循环由一些上层代码定期调用以轮询输入。

如果我在主线程上运行所有内容,那么这可以正常工作,因为 View 可以正确接收输入事件。

如果我将窗口创建和消息循环移至单独的线程,则 nextEventMatchingMask 不再返回任何事件,并且 View 不会接收输入。

我知道只有 Cocoa 应用程序中的“主”线程才应该处理事件。然而,这个辅助线程是唯一需要与 Cocoa 通信的线程,因此就 Cocoa 而言,我想将其用作“主”线程。这可能吗?我从该线程调用 NSApplicationLoad,据我所知,这是该进程中调用的第一个 Cocoa 函数。

如果我无法指定哪个是 Cocoa 主线程,那么是否有其他方法可以在后台线程上创建 NSWindow 并为其接收事件?我无法执行诸如调用 NSApplication Run 之类的操作,因为我无法控制应用程序的主循环。我只需要在上层代码请求时从窗口中提取输入事件即可。

最佳答案

也许您需要在辅助线程上启动运行循环。在主线程中,当您生成辅助线程时,请调用如下内容:

[NSThread detachNewThreadSelector:@selector(launchThread) 
toTarget:[ThreadHandler class]
withObject:nil];

在 ThreadHandler 类中,有类似以下内容:

+ (void)launchThread
{
NSRunLoop *threadRunLoop = [NSRunLoop currentRunLoop];
while (someThreadExitCondition && [threadRunLoop runMode:NSDefaultRunLoopMode beforeDate:[NSDate dateWithTimeIntervalSinceNow:1]]);
}

这应该启动您的线程运行循环处理事件。如果没有测试,我不确定这是否允许您处理在辅助线程中创建的窗口的事件,但它可能会让您开始了解如何运行线程的运行循环。您甚至可以设置类似分布式对象的情况,通过 NSConnection 将事件从主事件循环泵送到辅助线程 ( example )。希望这至少可以为您提供另一条追求的途径。

关于macos - 从后台线程泵送 Cocoa 消息循环,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8812951/

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