objective-c - 在非主线程中运行 Cocoa GUI

标签 objective-c multithreading macos cocoa user-interface

我在开发 Cocoa 用户界面时遇到了与图形用户界面/线程相关的问题。该应用程序设计如下:

主线程(#1):解析参数、加载插件等

Gui线程(#?):启动gui,处理事件等。它是gui线程。

Cocoa 框架是非线程安全的,但强制执行一条规则,GUI 必须在主线程上运行。断言用于检查这一点。为了尝试解决这个问题,我自己实现了运行方法(下面的代码)- http://cocoawithlove.com/2009/01/demystifying-nsapplication-by.html - 指导。但我错过了一些东西。打开一个窗口,但保持空白(完全白色)。尽管如果我在主线程中进行调用,它会完美运行。

所以基本上我需要弄清楚缺少什么。

- (void)run
{
    NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];

    [self finishLaunching];

    shouldKeepRunning = YES;
    do
    {
        [pool release];
        pool = [[NSAutoreleasePool alloc] init];

        NSEvent *event =
            [self
                nextEventMatchingMask:NSAnyEventMask
                untilDate:[NSDate distantFuture]
                inMode:NSDefaultRunLoopMode
                dequeue:YES];

        [self sendEvent:event];
        [self updateWindows];
    } while (shouldKeepRunning);

    [pool release];
}

- (void)terminate:(id)sender
{
    shouldKeepRunning = NO;
}

最佳答案

不要。这种方法永远行不通。即使您解决了当前的问题(窗口未绘制),您也会立即遇到另一个模糊的、无法解决的问题,一个又一个。 Cocoa 希望 GUI 线程成为主线程,故事结束。

关于objective-c - 在非主线程中运行 Cocoa GUI,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9761953/

相关文章:

android - 在 LooperThread 中获取处理程序返回 null

c++ - 使用非原子 bool 时的未定义行为

python - 多线程中的 Tornado 多个 IOLoop

c++ - 简单的 Qt 应用程序无法在 Mac OSX Yosemite 上打开

objective-c - 如何在自定义 NSView 上用 3 个手指(NSEvent)捕捉 1 次点击?

ios - NSURLSession 后台 session 中的 NSURLSessionDownloadTask 出错

objective-c - 了解第一响应者的系统逻辑

c - 编译 C 程序时,出现此错误 : hello: no such file or directory

ios - Grand Central Dispatch 是如何真正使用操作系统的?

ios - 如何从警报中的 TextField 获取输入文本