您可能不會以這種方式使用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
感謝您的快速回復賈斯汀。我會試試看。看起來相當複雜。 – 2010-09-03 07:42:38
不客氣。如果你需要2個類(就像在上面的例子中那樣),它通常很容易把cpp對象作爲一個objc對象的ivar。 – justin 2010-09-03 07:47:15
您是否暗示我有一個全局objc對象並使用它來訪問cpp對象。 – 2010-09-03 08:01:16