Multithreading 什么';将调用同步到NSView的好方法是什么?
我有一个从辅助线程接收新数据的视图。每一次,它都应该重新绘制自己。但是,运行循环的效果并不好,过了一段时间(这是不确定的),我最终在控制台中收到Multithreading 什么';将调用同步到NSView的好方法是什么?,multithreading,macos,synchronization,nsview,Multithreading,Macos,Synchronization,Nsview,我有一个从辅助线程接收新数据的视图。每一次,它都应该重新绘制自己。但是,运行循环的效果并不好,过了一段时间(这是不确定的),我最终在控制台中收到:kggerrorillegalargument:CGSUnionRegionWithRect:Invalid region消息 我不确定跨线程同步调用[查看设置需要显示:是]的正确方法是什么;你能帮我吗 为了澄清一点,线程B(实际上是一个调度队列)通过调用以下命令为视图提供了新内容: -(void)setImageBuffer:(unsigned ch
:kggerrorillegalargument:CGSUnionRegionWithRect:Invalid region
消息
我不确定跨线程同步调用[查看设置需要显示:是]
的正确方法是什么;你能帮我吗
为了澄清一点,线程B(实际上是一个调度队列)通过调用以下命令为视图提供了新内容:
-(void)setImageBuffer:(unsigned char*)buffer
{
/* image handling stuff; thread-safe */
[self setNeedsDisplay:YES]; // but this is not thread-safe
}
然后运行运行运行循环的线程A应该重新显示视图。使用GCD,您不需要额外的代理方法:
-(void)setImageBuffer:(unsigned char*)buffer
{
/* image handling stuff; thread-safe */
[self performSelectorOnMainThread:@selector(induceRedraw)
withObject:nil
// Don't just copy this; pick one...
waitUntilDone:YES or NO];
}
-(void)induceRedraw
{
[self setNeedsDisplay:YES]; // but this is not thread-safe
}
dispatch_queue_t q = dispatch_get_main_queue();
dispatch_async(q, ^(void) {
[self setNeedsDisplay: YES];
});
嗯
NSObject
肯定是我最不想看的地方。非常感谢。您可能想阅读《线程编程指南》,它会给您提供一些线索。@JWWalker:也许您是想轻松地嘲弄一下,但您的评论却被认为是侮辱性的,这是不必要的。我自己也不知道有这样一位向导,通过其他方式了解了我的知识。@Marcelo Cantos:我的意思是,这既不是侮辱,也不是嘲弄,只是信息@zneak暗示他不知道从哪里可以找到performSelectorOnMainThread,而且他显然是线程新手(至少在Cocoa中是如此),所以他应该阅读指南。@JWWalker:这很公平。“本来会给你一个线索”这句话听起来像是在暗示“你没有线索”,如果没有任何面部暗示,就不可能知道你想要的是什么意思。