C ++ブーストスレッドからのnsopenpanel
-
12-10-2019 - |
質問
Boost C ++によって作成されたスレッドからNsopenpanelを呼び出しています。
パネルは不規則に動作し、マウスにうまく応答しません。オブジェクトをクリックすると、上位レベルのコンボボックスをクリックすると応答が改善されると、何もしません。
独自のループを実行するのに役立つRunmodalfordirectoryを行っている別のRunloopを実行しますか。
また、メインスレッドでパネルを表示するためにSelectorOnMainThreadを実行する別のOBJCクラスも作成しましたが、それでも動作は同じです。
[ps performSelectorOnMainThread:@selector(showOpenPanel) withObject:nil
waitUntilDone:YES
modes:[NSArray arrayWithObject:NSRunLoopCommonModes]];
また、waituntildone:no and crunloopruninmodeを実行してみましたが、これも役に立ちません。
- (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;
}
解決
NSOpenPanel
AppKitの一部です。 AppKit関数とクラスは、メインスレッドでのみ安全に使用できます。
使用したコードを見せてください performSelectorOnMainThread
ですから、なぜあなたがまだ問題を見ているのかを理解するのを手伝うことができます。私はあなたがそれを使って個々の方法を呼んでいると思う - それはあなたが期待する方法では機能しません。あなたの相互作用の全体のためにメインスレッドにコールバックします NSOpenPanel
.
所属していません StackOverflow