NSOpenPanel da C ++ filo spinta
-
12-10-2019 - |
Domanda
sto invocando un NSOpenPanel da un thread creato da spinta C ++.
i si comporta in modo irregolare del pannello e non risponde bene ai mouse, che è cliccando su oggetti non fa nulla a volte quando si fa clic sul top box livello combinata non migliorare la risposta.
faccio ho eseguire un runloop separata che sto facendo un runModalForDirectory che dovrebbe occuparsi di gestire il proprio ciclo.
Ho anche creato una classe objc separato che fa performSelectorOnMainThread mostrare pannello in thread principale, ma ancora il comportamento è lo stesso.
[ps performSelectorOnMainThread:@selector(showOpenPanel) withObject:nil
waitUntilDone:YES
modes:[NSArray arrayWithObject:NSRunLoopCommonModes]];
Ho anche provato con waitUntilDone:. NO e l'esecuzione di un CFRunLoopRunInMode che non sta aiutando sia
- (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;
}
Soluzione
NSOpenPanel
fa parte di AppKit. AppKit funzioni e classi possono essere usati con sicurezza solo sul thread principale.
Mostraci il codice è stato utilizzato con performSelectorOnMainThread
in modo che possiamo aiutare a capire il motivo per cui si potrebbe ancora essere problemi a vedere. Ho il sospetto che si sta chiamando i metodi individuali con esso - do not; non funzionerà nel modo previsto. Chiamata al thread principale per la totalità della vostra interazione con NSOpenPanel
.