2010-12-20 59 views
0

我從boost C++創建的線程調用NSOpenPanel。來自C++ boost線程的NSOpenPanel

面板的行爲不正常,對鼠標響應不好,即單擊對象時點擊最高級別組合框確實會提高響應時不會執行任何操作。

我要運行一個單獨的runloop我正在做一個runModalForDirectory應該照顧運行自己的循環。

我也創建了一個單獨的objc類,它執行SelectorOnMainThread在主線程中顯示面板,但仍然行爲相同。

[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

NSOpenPanel是AppKit的一部分。 AppKit函數和類只能在主線程中安全使用。

向我們顯示您與performSelectorOnMainThread一起使用的代碼,以便我們幫助您弄清楚爲什麼您仍然可能會看到問題。我懷疑你在用它調用個別方法 - 不要;它不會像你期望的那樣工作。請回到主線程,以獲得與NSOpenPanel互動的全部內容。

+0

編輯顯示代碼 – user549164 2010-12-20 21:44:46

+0

接受youranswer我已經得到這個與我發佈的代碼一起工作。 – user549164 2010-12-23 00:59:57