iPhoneOS:在C++类中使用detachNewThreadSelector方法

问题描述:

我有一个C++类方法,我需要用所有参数调用“detachNewThreadSelector”方法。
这里存在的问题,因为我的类不客观C我没有自己的指针。另外我不明白我将如何能够从我将设置为选择器的方法中调用类方法。
请问如果我的问题不清楚,我不是来自讲英语的国家。
这是一些代码。iPhoneOS:在C++类中使用detachNewThreadSelector方法

ALuint AudioController::PlayStream(const string& asset) 
{ 
     //attach to a thread 
    [NSThread detachNewThreadSelector:(SEL)selector  toTarget:(id)selfwithObject:(id)argument] 

} 

void AudioController::RotateThread(const string& soundKey) 
{ 
} 

正如你可以看到我如何通过RotateThread方法,选择了“detachNewThreadSelector”,也从哪里获得的自指针。

任何帮助非常赞赏。
谢谢

您可能不会以这种方式使用C++对象(作为此NSThread方法的参数)。如果你的情况很简单(阅读:声明的接口很少),那么你可以创建一个实用程序(objc)类来处理消息,然后将参数传递回AudioController实例。插图:

(未编译的伪代码如下所示)

namespace pseudo_object { 
template <typename> class reference_counted; 
} 

@interface MONAudioControllerWorker : NSObject 
{ 
    pseudo_object::reference_counted<AudioController> audioController_; 
    std::string asset_; 
} 

+ (MONAudioControllerWorker *)newMONAudioControllerWorkerWithAudioController:(pseudo_object::reference_counted<AudioController>&)audioController asset:(const std::string&)asset; 
- (void)secondaryWorker; 

@end 

@implementation MONAudioControllerWorker 

+ (MONAudioControllerWorker *)newMONAudioControllerWorkerWithAudioController:(pseudo_object::reference_counted<AudioController>&)audioController asset:(const std::string&)asset 
{ 
/* ... */ 
} 

- (void)secondaryWorker 
{ 
    NSAutoreleasePool * pool([NSAutoreleasePool new]); 
    audioController_->RotateThread(asset_); 
    [pool release]; 
} 

@end 
/* static */ 
ALuint AudioController::PlayStream(pseudo_object::reference_counted<AudioController>& This, const string& asset) 
{ 
/* attach to a thread */ 
    MONAudioControllerWorker * controller = [MONAudioControllerWorker newMONAudioControllerWorkerWithAudioController:This asset:asset]; 
    [NSThread detachNewThreadSelector:@selector(secondaryWorker) toTarget:controller withObject:0]; 
    [controller release]; 
} 

有时它只是更容易地创建,其可以含有用于此目的的简单(通用)接口的objc类(即重复使用的超出此目的) ,或者使用更传统的线程例程(pthread)。如果这是该项目中唯一的情况,那么它应该没问题。否则,你最终会得到许多实用程序类/符号和更多的维护。插图:

@interface MONAudioControllerWrapper : NSObject 
{ 
    AudioController audioController_; 
    std::string asset_; 
} 

+ (MONAudioControllerWrapper *)newMONAudioControllerWrapperWithAsset:(const std::string&)asset; 

- (void)playStream; 

@end 

@implementation MONAudioControllerWrapper 

+ (MONAudioControllerWrapper *)newMONAudioControllerWrapperWithAsset:(const std::string&)asset 
{ 
/* ... */ 
} 

- (void)secondaryWorker 
{ 
    NSAutoreleasePool * pool([NSAutoreleasePool new]); 
    audioController_->RotateThread(asset_); 
    [pool release]; 
} 

- (void)playStream 
{ 
    [NSThread detachNewThreadSelector:@selector(secondaryWorker) toTarget:self withObject:0]; 
} 

@end 
+0

感谢您的快速回复贾斯汀。我会试试看。看起来相当复杂。 – 2010-09-03 07:42:38

+0

不客气。如果你需要2个类(就像在上面的例子中那样),它通常很容易把cpp对象作为一个objc对象的ivar。 – justin 2010-09-03 07:47:15

+0

您是否暗示我有一个全局objc对象并使用它来访问cpp对象。 – 2010-09-03 08:01:16

你不能这样做。它不像“我在哪里得到自己的指针?”那样简单?实际的问题是,“我在哪里可以得到可以回复消息的东西?”因为一个C++类不能。 Objective-C类,对象和方法与C++类,对象和方法完全不同。两种语言使用相同的术语并将这些东西用于类似目的的事实使很多人感到困惑,但要清楚:在两种语言中,它们是完全不同的,以完全不同的方式工作的东西。例如:C++方法只是简单地调用,而不是像Objective-C方法那样根据选择器调度。而C++类甚至不是对象。

您这里有两个真正的选择:

  1. 创建有你想要的行为的Objective-C类。

  2. 使用C++并发解决方案。

+0

您能否提供一个实现C++并发解决方案的代码片段?非常有兴趣了解它。谢谢 – 2010-09-03 07:51:15

+0

@John M:这不是我的特长,但这里是我在Stack Overflow上找到的一个例子:http://antonym.org/2009/05/threading-with-boost---part-i-creating-threads。 HTML – Chuck 2010-09-03 07:57:59

正如其他人所说的,你不能使用detachThreadWithSelector:传递一个C++对象作为目标或使用C++方法作为选择器。

有两种策略:

  1. 包裹以客观-C的对象和选择例如对象和选择

    myAudioControllerWrapper = [[OCAudioControllerWrapper alloc] initWithRealController: this]; 
    // need some code to release once thread is complete 
    [NSThread detachNewThreadSelector: @selector(wrapperSelector:) target: myAudioControllerWrapper withObject: soundKeyAsNSObject]; 
    

    和您的包装选择是这样的:

    -(void) wrapperSelector: (id) key 
    { 
        cppController->rotateThread([key cppObject]); 
    } 
    
  2. 使用一些其他的线程机制更符合C++范例一致。如果您的平台支持它,则可能是Grand Central Dispatch