来自C ++的NSOpenPanel提升线程

时间:2010-12-20 21:13:53

标签: c++ cocoa boost-thread nsopenpanel

我正在从boost C ++创建的线程中调用NSOpenPanel。

面板行为不规律且对鼠标反应不好,点击对象时,点击顶级组合框确实无法改善响应。

我要运行一个单独的runloop我正在做一个runModalForDirectory,它应该负责运行自己的循环。

我还创建了一个单独的objc类,它执行performSelectorOnMainThread以在主线程中显示面板,但行为仍然相同。

[ps performSelectorOnMainThread:@selector(showOpenPanel) withObject:nil 
                      waitUntilDone:YES
                      modes:[NSArray arrayWithObject:NSRunLoopCommonModes]];

我也尝试过waitUntilDone:NO并且运行CFRunLoopRunInMode也没有帮助。

- (bool) showOpenPanel
{
    NSOpenPanel *op = [NSOpenPanel openPanel];
    [op setAllowsMultipleSelection:YES];
    [op setTitle:@"Choose File"];
    [op setMessage:@"Choose file for Importing."];
    [op setFloatingPanel:true]; 
    bool result =[op runModalForDirectory:NSHomeDirectory() file:nil types:self.fileTypes];
    if (result == NSOKButton) {
        [self setSelectedFiles:[op filenames]];
        [self setLastShowResult:true];
    }
    else {
        [self setLastShowResult:false];
    }

    [self setPanelIsDone:true]; 
    return self.lastShowResult;
}

1 个答案:

答案 0 :(得分:1)

NSOpenPanel是AppKit的一部分。 AppKit函数和类只能在主线程上安全使用。

向我们展示您与performSelectorOnMainThread一起使用的代码,以便我们帮助您找出可能仍然存在问题的原因。我怀疑你用它来调用个人方法 - 不要;它不会像你期望的那样工作。回调主线程,与NSOpenPanel进行全面互动。