gpt4 book ai didi

objective-c - Cocoa:处理线程结果,并对多个工作表进行排队

转载 作者:行者123 更新时间:2023-12-03 17:00:21 24 4
gpt4 key购买 nike

我有一个多线程应用程序,它同时进行许多并发操作。当每个线程完成时,它会调用主线程上的两个方法之一

performSelectorOnMainThread:@selector(operationDidFinish:)
// and
performSelectorOnMainThread:@selector(operationDidFail:withMessage:)

当操作失败时,我会启动一个显示错误消息的工作表,并向用户提供两个按钮:“取消”和“重试”。这是我用来启动工作表的代码:

// failureSheet is a NSWindowController subclass

[NSApp beginSheet:[failureSheet window]
modalForWindow:window
modalDelegate:self
didEndSelector:@selector(failureSheetDidEnd:returnCode:contextInfo:)
contextInfo:nil];

问题是,如果 2 个并发操作同时失败,则显示的当前工作表将被上次失败消息覆盖,然后用户的“重试”操作将仅重试上次失败的操作。理想情况下,我想对这些故障表进行“排队”。如果 2 个操作同时失败,那么您应该一张一张地看到 2 张纸,允许用户单独取消或重试它们。

我尝试过使用:

[NSApp runModalSessionForWindow:[failureSheet window]] 

这似乎可以满足我的要求,但在我的情况下不起作用。也许它不是线程安全的?

例如以下代码可以工作...

- (void)displaySheet
{
[NSApp beginSheet:[failureSheet window]
modalForWindow:window
modalDelegate:self
didEndSelector:@selector(failureSheetDidEnd:returnCode:contextInfo:)
contextInfo:nil];

[NSApp runModalForWindow:[failureSheet window]];

[NSApp endSheet:[failureSheet window]];

[[failureSheet window] orderOut:nil];
}

// Calling this method from a button press works...
- (IBAction)testDisplayTwoSheets
{
[self displaySheet];
[self displaySheet];
}

但是,如果我有 2 个不同的线程操作在完成时调用 displaySheet(在主线程上),我只会看到一张表,当我关闭它时,模式 session 仍在运行,而我的应用程序基本上被卡住了。

对于我做错了什么有什么建议吗?

最佳答案

如果您想对它们进行排队,那么只需对它们进行排队即可。创建结果对象的 NSMutableArray (您可以使用操作、失败表本身,或者为您提供表信息的数据对象;只要方便即可)。在 operationDidFinish: (始终在主线程上运行,因此这里没有锁定问题)中,您可以执行以下操作:

[self.failures addObject:failure];
if ([[self window] attachedSheet] == nil)
{
// Only start showing sheets if one isn't currently being shown.
[self displayNextFailure];
}

然后你就会:

- (void)displayNextFailure
{
if ([self.failures count] > 0)
{
MYFailure runFailure = [self.failures objectAtIndex:0];
[self.failures removeObjectAtIndex:0];
[displaySheetForFailure:failure];
}
}

failureSheetDidEnd:returnCode:contextInfo: 结束时,只需确保调用 [self displayNextFailure]

也就是说,如果经常发生的话,这可能是一个可怕的用户界面(没有什么比一张一张地显示更糟糕的了)。我可能会寻找修改现有工作表以显示多个错误的方法。

关于objective-c - Cocoa:处理线程结果,并对多个工作表进行排队,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2312905/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com