@H_404_6@
我偶然发现了我正在使用
cocoa开发的应用程序中的一个问题.
我需要做一些处理,我在一个单独的线程上做.我这样做,所以我可以使用NSProgressIndicator显示进度,而不是挂起主线程. (如果他/她想要,用户可以取消执行).
我需要做一些处理,我在一个单独的线程上做.我这样做,所以我可以使用NSProgressIndicator显示进度,而不是挂起主线程. (如果他/她想要,用户可以取消执行).
它几乎完美地工作,但是有一个问题:处理产生了大量文件,如果这些文件中有一个或多个已经存在,我想询问用户是否可以在实际操作之前覆盖它们.所以我尝试使用处理线程中的NSRunAlertPanel().
它有时会起作用.其他时候,警报面板会闪烁,在我点击之前没有特殊原因关闭,或根本不显示.所以我认为NSRunAlertPanel()可能不是线程安全的,并且由于竞争条件而导致这种情况变得很糟糕.
我想知道:除了不断地使用计时器从主线程轮询处理线程的进度之外,有没有办法可以解决这个问题?
是从其他任何线程使用GUI主要的一个固有的不安全?
提前致谢.
编辑:我正在遵循马克的指示,但仍然有问题,因为我的NSAlerts(我现在也在使用)仍在消失.这是我的处理线程.
- (void)doProcess:(id)param { // ... [self performSelectorOnMainThread:@selector(askForConfirmation) withObject:nil waitUntilDone:YES]; // ... }
然后在我的主线程上:
- (void)askForConfirmation { [[NSAlert alertWithMessageText:@"Test." defaultButton:@"OK" alternateButton:nil otherButton:nil informativeTextWithFormat:@"Testing."] runModal]; } - (IBAction)startProcessing:(id)sender { // ... [NSThread detachNewThreadSelector:@selector(doProcess:) toTarget:self withObject:nil]; // ... }