【发布时间】:2012-02-07 10:27:38
【问题描述】:
我有一个基于 Cocoa 的命令行应用程序,它以编程方式创建一个 NSWindow + NSView。它使用 nextEventMatchingMask 循环来手动泵送事件循环和调度事件。这个循环被一些上层代码周期性地调用来轮询输入。
如果我在主线程上运行所有内容,那么这可以正常工作,因为视图可以正确接收输入事件。
如果我将窗口创建和消息循环移动到单独的线程,则 nextEventMatchingMask 不再返回任何事件并且视图不会接收输入。
我知道只有 Cocoa 应用程序中的“主”线程应该处理事件。然而,这个辅助线程是唯一需要与 Cocoa 对话的线程,所以就 Cocoa 而言,我想将它用作“主”线程。这可能吗?我从这个线程调用 NSApplicationLoad,据我所知,这是进程中调用的第一个 Cocoa 函数。
如果我不能指定哪个是主 Cocoa 线程,那么有没有其他方法可以在后台线程上创建一个 NSWindow 并为其接收事件?我无法执行调用 NSApplication Run 之类的操作,因为我无法控制应用程序的主循环。当上层代码请求我这样做时,我只需要从窗口中提取输入事件。
【问题讨论】:
-
这个:stackoverflow.com/questions/6178618/… 听起来和我的情况一模一样。