2010-12-20 9 views
0

私はboost C++で作成されたスレッドからNSOpenPanelを呼び出しています。それは、オブジェクトをクリックしているパネルが不規則に動作し、マウスによく反応しないC++のNSOpenPanelブーストスレッド

は、トップレベルのコンボボックスをクリックしたときの応答性を改善し、いつか何もしません。

は私が独自のループを実行しているの世話をする必要がありrunModalForDirectoryをやっている別の実行ループを実行するようにしまし行います。

私はまた、メインスレッドでパネルを表示するにはperformSelectorOnMainThreadが、まだ動作は同じであるん別々にObjCクラスを作成しました。

[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

+0

を受け入れていますyouranswer私が投稿したコードで動作するようになっています。 – user549164

関連する問題