Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/70.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/entity-framework/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
将pthread转换为objective-c_Objective C_C_Pthreads - Fatal编程技术网

将pthread转换为objective-c

将pthread转换为objective-c,objective-c,c,pthreads,Objective C,C,Pthreads,我正在尝试将以下内容转换为objective-ccode 这是我在C中的当前线程,运行良好 //calling EnrollThread method on a thread in C pthread_t thread_id; pthread_create( &thread_id, NULL, EnrollThread, pParams ); //What the EnrollThread method structure looks like in C void* EnrollTh

我正在尝试将以下内容转换为
objective-c
code

这是我在
C
中的当前线程,运行良好

//calling EnrollThread method on a thread in C
pthread_t thread_id; 
pthread_create( &thread_id, NULL, EnrollThread, pParams );

//What the EnrollThread method structure looks like in C
void* EnrollThread( void *arg )
我的方法结构现在是什么样子的,我已经把它改成了objective-c

-(void)enrollThreadWithParams:(LPBIOPERPARAMS)params;
现在我不知道如何使用
pthread\u create
调用调用这个
objective-c
方法。 我试过这样的方法:

pthread_create( &thread_id, NULL, [refToSelf enrollThreadWithParams:pParams], pParams );
但我相信我错了。有人能告诉我为什么这不起作用,以及我需要做什么来修复它,以便在后台创建我的线程吗?我的UI将被锁定,直到方法完成它所做的事情


我也在考虑使用
dispatch\u sync
,但我还没有尝试过

在objective C中,您并没有真正使用
pthread\u create
,尽管您仍然可以使用它,但线程入口点必须是一个C函数,因此我不确定这是否是最好的方法

有许多选项,您可以在和文档中阅读

  • performSelectorInBackground
    NSObject(和子类)的方法
  • dispatch\u async
    (不是您提到的
    dispatch\u sync
  • NSOperation和NSOperationQueue
  • NSThread类

我建议您尝试一下第一个,因为它是最简单、最直接的,第二个也很简单,因为您不必创建外部对象,只需将要并行执行的代码内联放置即可。

在objective C中,您并不真正使用
pthread\u create
,尽管您仍然可以使用它,但是线程入口点需要是一个C函数,所以我不确定这是否是最好的方法

有许多选项,您可以在和文档中阅读

  • performSelectorInBackground
    NSObject(和子类)的方法
  • dispatch\u async
    (不是您提到的
    dispatch\u sync
  • NSOperation和NSOperationQueue
  • NSThread类

我建议您尝试一下第一个,因为它是最简单、最直接的,第二个也很简单,因为您不必创建外部对象,只需将要并行执行的代码内联放置即可。

在objective C中,您并不真正使用
pthread\u create
,尽管您仍然可以使用它,但是线程入口点需要是一个C函数,所以我不确定这是否是最好的方法

有许多选项,您可以在和文档中阅读

  • performSelectorInBackground
    NSObject(和子类)的方法
  • dispatch\u async
    (不是您提到的
    dispatch\u sync
  • NSOperation和NSOperationQueue
  • NSThread类

我建议您尝试一下第一个,因为它是最简单、最直接的,第二个也很简单,因为您不必创建外部对象,只需将要并行执行的代码内联放置即可。

在objective C中,您并不真正使用
pthread\u create
,尽管您仍然可以使用它,但是线程入口点需要是一个C函数,所以我不确定这是否是最好的方法

有许多选项,您可以在和文档中阅读

  • performSelectorInBackground
    NSObject(和子类)的方法
  • dispatch\u async
    (不是您提到的
    dispatch\u sync
  • NSOperation和NSOperationQueue
  • NSThread类

我建议您尝试一下第一个,因为它是最简单、最直接的,第二个也很简单,因为您不必创建外部对象,只需将代码内联以并行方式执行即可。

如果您已经有了工作代码,那么就没有理由放弃pthreads。你应该能很好地使用它

但是,如果您想要一个替代方案,但希望保留现有的pthread入口点,那么可以很容易地做到这一点

dispatch_queue_t queue = dispatch_queue_create("EnrollThread", DISPATCH_QUEUE_SERIAL);
dispatch_async(queue, ^{
    EnrollThread(parms);
});

如果您已经有了工作代码,那么就没有理由放弃pthreads。你应该能很好地使用它

但是,如果您想要一个替代方案,但希望保留现有的pthread入口点,那么可以很容易地做到这一点

dispatch_queue_t queue = dispatch_queue_create("EnrollThread", DISPATCH_QUEUE_SERIAL);
dispatch_async(queue, ^{
    EnrollThread(parms);
});

如果您已经有了工作代码,那么就没有理由放弃pthreads。你应该能很好地使用它

但是,如果您想要一个替代方案,但希望保留现有的pthread入口点,那么可以很容易地做到这一点

dispatch_queue_t queue = dispatch_queue_create("EnrollThread", DISPATCH_QUEUE_SERIAL);
dispatch_async(queue, ^{
    EnrollThread(parms);
});

如果您已经有了工作代码,那么就没有理由放弃pthreads。你应该能很好地使用它

但是,如果您想要一个替代方案,但希望保留现有的pthread入口点,那么可以很容易地做到这一点

dispatch_queue_t queue = dispatch_queue_create("EnrollThread", DISPATCH_QUEUE_SERIAL);
dispatch_async(queue, ^{
    EnrollThread(parms);
});

并发编程的go-to参考是引导您通过调度队列(称为Grand Central dispatch,GCD)和操作队列的。两者都非常容易使用,并提供各自的优势

在最简单的形式中,这两种方法都非常容易使用。正如其他人所指出的,创建调度队列,然后向该队列调度某物的过程是:

dispatch_queue_t queue = dispatch_queue_create("com.domain.app", DISPATCH_QUEUE_CONCURRENT);

dispatch_async(queue, ^{
    // something to do in the background
});
等效的操作队列为:

NSOperationQueue *queue = [[NSOperationQueue alloc] init];

[queue addOperationWithBlock:^{
    // something to do in the background
}];
就个人而言,我更喜欢操作队列,其中:

  • 我需要控制/有限的并发性(即,我将向该队列分配一组内容,我希望它们不仅与主队列并发运行,而且与其他队列并发运行,但我不希望同时运行的内容超过几个)。一个很好的例子是在执行并发网络请求时,您希望它们同时运行(因为您可以获得巨大的性能优势),但在任何给定的时间内,您通常不希望它们中的四个以上运行)。使用操作队列,可以指定
    maxConcurrentOperation