vous ne pouvez pas utiliser l'objet C++ de cette manière (en tant qu'argument de cette méthode NSThread). Si votre cas est simple (lisez: peu d'interfaces déclarées), vous pouvez créer une classe utilitaire (objc) pour gérer le message, puis renvoyer l'argument à l'instance AudioController. Illustration:
(code pseudo non compilé suit)
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];
}
parfois, il est plus facile de créer une classe objc qui peut contenir une version simplifiée interface (générique) à cet effet (par exemple réutilisable au-delà de cet objet) ou pour utiliser des routines de threading plus traditionnelles (pthreads). Si c'est le seul cas dans le projet, alors ça devrait aller. Sinon, vous vous retrouvez avec de nombreuses classes/symboles utilitaires et beaucoup plus à entretenir. illustration:
@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
Merci pour la réponse rapide justin. Je vais essayer ça. Ça a l'air assez compliqué. –
de rien. Si vous avez besoin de 2 classes (comme dans le cas ci-dessus), il est * souvent * plus facile de mettre l'objet cpp en ivar d'un objet objc. – justin
Est-ce que vous sous-entendez que j'ai un objc global et que je l'utilise pour accéder aux objets cpp. –