Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Multithreading 什么';将调用同步到NSView的好方法是什么?_Multithreading_Macos_Synchronization_Nsview - Fatal编程技术网

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:这很公平。“本来会给你一个线索”这句话听起来像是在暗示“你没有线索”,如果没有任何面部暗示,就不可能知道你想要的是什么意思。