Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/macos/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Objective c 如何使[NsApp run]不阻塞?_Objective C_Macos_Cocoa - Fatal编程技术网

Objective c 如何使[NsApp run]不阻塞?

Objective c 如何使[NsApp run]不阻塞?,objective-c,macos,cocoa,Objective C,Macos,Cocoa,我是个十足的可可新手 现在,我的简单Hello World应用程序在从main调用[NsApp run]后阻塞 我所需要的只是创建一个窗口,而不是阻塞主窗口 我希望我的应用程序的行为与glfw类似: 出于某种原因,它不会在那里阻塞。事实上,您可以删除这一行,它仍然可以工作 我一直在和一个glfw源玩,想弄清楚他们有什么不同。例如,如果我删除[NsApp setDelegate:_glfw.ns.delegate],[NsApp run]就会阻塞 但事实并非如此 根据报告: NSApplicati

我是个十足的可可新手

现在,我的简单Hello World应用程序在从main调用[NsApp run]后阻塞

我所需要的只是创建一个窗口,而不是阻塞主窗口

我希望我的应用程序的行为与glfw类似:

出于某种原因,它不会在那里阻塞。事实上,您可以删除这一行,它仍然可以工作

我一直在和一个glfw源玩,想弄清楚他们有什么不同。例如,如果我删除[NsApp setDelegate:_glfw.ns.delegate],[NsApp run]就会阻塞

但事实并非如此

根据报告:

NSApplication类在运行期间设置@autorelease块 初始化,特别是在事件循环内部 初始化或共享和运行方法

通常,应用程序会在事件循环运行时创建对象 正在运行或通过从nib文件加载对象,因此缺少访问权限 通常不是问题。但是,如果您确实需要使用Cocoa类 除了加载nib文件或 实例化NSApplication时,应创建@autorelease块以 包含使用类的代码

我想这就是我需要的,但我不知道如何使用@autorelease块

谢谢你的帮助。

我知道了

GLFW实现自己的事件循环,因此无需调用[NSApp run]:

NSEvent *event = [NSApp nextEventMatchingMask:NSEventMaskAny
                                        untilDate:[NSDate distantFuture]
                                           inMode:NSDefaultRunLoopMode
                                          dequeue:YES];
    [NSApp sendEvent:event];
我想出来了

GLFW实现自己的事件循环,因此无需调用[NSApp run]:

NSEvent *event = [NSApp nextEventMatchingMask:NSEventMaskAny
                                        untilDate:[NSDate distantFuture]
                                           inMode:NSDefaultRunLoopMode
                                          dequeue:YES];
    [NSApp sendEvent:event];

我只是经历了同样的情况。 我找到了一个稍微不同的解决方案


只需调用[[NSApplication sharedApplication]run];创建窗口时,调用[[NSApplication sharedApplication]停止:nil];,运行调用现在将退出。然后您仍然可以调用sendEvent方法。

我刚刚经历了相同的场景。 我找到了一个稍微不同的解决方案


只需调用[[NSApplication sharedApplication]run];创建窗口时,调用[[NSApplication sharedApplication]停止:nil];,运行调用现在将退出。然后你仍然可以调用sendEvent方法。

我自己也在研究这个问题,并决定将每个人所说的一切整理成一个答案

您可能应该注意到,运行阻塞的原因是因为它在功能上类似于内部的while1循环,该循环更新窗口并处理事件等。调用[NSApp stop]会停止这个循环,这样它就不会再阻塞好的循环,但我们也不会再有坏的循环

总的来说,GLFW的工作如下:

创建非应用程序,创建委托,并将委托设置为应用程序

在NSApp上调用run和stop。在代理的ApplicationIDFinishLaunching中调用stop

在每个帧上,从队列中获取下一个事件,并将其分派到应用程序中

更深入的代码:PS。所有代码都从

注意isFinishedLaunching保护存在,因为代理中的ApplicationIDFinishLaunching仅在第一次运行调用之后才被调用。如果出于某种原因,用户再次调用glfwInit,那么在没有保护运行的情况下,将调用它,导致它再次阻塞

// src/cocoa_init.m
@interface GLFWApplicationDelegate : NSObject <NSApplicationDelegate>
@end

@implementation GLFWApplicationDelegate

  ...

- (void)applicationDidFinishLaunching:(NSNotification *)notification
{
    _glfwPlatformPostEmptyEvent();
    [NSApp stop:nil];
}
@end
注意:glfwPollEvents从队列中检索下一个事件,然后将该事件发送到应用程序,以便通过响应程序进行传播。它的功能与中介绍的主循环相同

在主事件循环中,应用程序对象NSApp连续获取事件队列中的下一个最顶层事件,将其转换为NSEvent对象,并将其分派到最终目标


我自己也一直在研究这个问题,并决定把所有人说的话都整理成一个答案

您可能应该注意到,运行阻塞的原因是因为它在功能上类似于内部的while1循环,该循环更新窗口并处理事件等。调用[NSApp stop]会停止这个循环,这样它就不会再阻塞好的循环,但我们也不会再有坏的循环

总的来说,GLFW的工作如下:

创建非应用程序,创建委托,并将委托设置为应用程序

在NSApp上调用run和stop。在代理的ApplicationIDFinishLaunching中调用stop

在每个帧上,从队列中获取下一个事件,并将其分派到应用程序中

更深入的代码:PS。所有代码都从

注意isFinishedLaunching保护存在,因为代理中的ApplicationIDFinishLaunching仅在第一次运行调用之后才被调用。如果出于某种原因,用户再次调用glfwInit,那么在没有保护运行的情况下,将调用它,导致它再次阻塞

// src/cocoa_init.m
@interface GLFWApplicationDelegate : NSObject <NSApplicationDelegate>
@end

@implementation GLFWApplicationDelegate

  ...

- (void)applicationDidFinishLaunching:(NSNotification *)notification
{
    _glfwPlatformPostEmptyEvent();
    [NSApp stop:nil];
}
@end
注意:glfwPollEvents从队列中检索下一个事件,然后将该事件发送到应用程序,以便通过响应程序进行传播。它的功能与中介绍的主循环相同

在主事件循环中,应用程序对象NSApp con 连续获取事件队列中最上面的下一个事件,将其转换为NSEvent对象,并将其分派到最终目标


你甚至不想告诉我为什么要调用[NsApp run]和在哪里运行?根据,应用程序会一直运行,直到你告诉它退出为止。@ElTomato我已经更新了问题。我所需要的只是创建一个窗口,而不是阻塞main。@Willeke它在glfw中不阻塞。我想知道他们是如何做到的。浏览链接的代码,看看GLFWApplicationDelegate是做什么的。你甚至不想告诉我为什么要调用[NsApp run]和在哪里运行?根据,应用程序会一直运行,直到你告诉它退出为止。@ElTomato我已经更新了问题。我所需要的只是创建一个窗口,而不是阻塞main。@Willeke它在glfw中不阻塞。我想知道他们是如何做到的。浏览链接的代码,看看GLFWApplicationEndelegate做了什么。