Nsopenpanel из потока Boost C ++
-
12-10-2019 - |
Вопрос
Я вызываю NsopenPanel из потока, созданной Boost C ++.
Панель ведет себя беспорядочно и не очень хорошо реагирует на мышь, которая нажимает на объекты, когда -то ничего не делает, когда нажатие на комбо -поле на верхнем уровне улучшает ответ.
Я запускаю отдельный Runloop, я занимаюсь Runmodalfordirectory, который должен позаботиться о своем собственном цикле.
Я также создал отдельный класс OBJC, который выполняет SelectorOnmainthread, чтобы показать панель в главном потоке, но поведение все же.
[ps performSelectorOnMainThread:@selector(showOpenPanel) withObject:nil
waitUntilDone:YES
modes:[NSArray arrayWithObject:NSRunLoopCommonModes]];
Я также попробовал с Waithuntildone: нет и управлять 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;
}
Решение
NSOpenPanel
является частью Appkit. Функции Appkit и классы могут быть безопасно использованы только в основном потоке.
Покажите нам код, с которым вы использовали performSelectorOnMainThread
Таким образом, мы можем помочь выяснить, почему вы все еще увидите проблемы. Я подозреваю, что вы называете индивидуальные методы с этим-не; Это не сработает так, как вы ожидаете. Перезвоните в основной теме для совокупности вашего взаимодействия с NSOpenPanel
.