2011-02-15 7 views
1

Je travaille sur une application qui lit des images (images) de la caméra, effectue un traitement avec l'image puis affiche le résultat dans l'interface utilisateur. Les images de la caméra viennent dans un délégué qui est appelé dans un autre thread (c'est-à-dire pas le thread principal) et je fais tous les trucs de traitement d'image dans ce thread et je fais juste un execSelectorOnMainThread: quand l'image est terminée.UIImage et multithread

Le problème est que, avant et après le traitement, je convertis l'image en un format interne. Pour ces conversions, j'utilise CGContext. Comme j'obtiens un étrange EXC_BAD_ACCESS, je commence à me demander s'il y a un problème à utiliser CGContext dans n'importe quel autre thread que main. Est-ce que j'appelle simplement performSelectorOnMainThread: dès que j'aurai le cadre (l'API de la caméra appellera déjà mon délégué dans un autre thread) et que je ferai tout sur le thread principal? Ou CGContext est bien avec le multithreading, et le bug est probablement quelque chose d'autre?

Un autre problème qui pourrait causer le problème: le UIImage est créé dans le thread de traitement, puis utilisé (et plus tard publié) sur le thread principal. Cela peut-il causer un problème lié à l'Autorealease-pool?

+0

Quel type de CGContext utilisez-vous? – tadejsv

+0

C'est un contexte bitmap, créé avec CGBitmapContextCreate. – fbafelipe

+0

CGContext est très bien sur le thread d'arrière-plan, mais les règles normales s'appliquent. Le code que vous écrivez doit être thread-safe. Quel type de synchronisation utilisez-vous? Le UIImage pourrait être plus d'un problème. – hooleyhoop

Répondre

0

Le problème était dans la conversion du format interne à l'UIImage, pas dans le multithreading, il est correct d'utiliser CGContext dans les threads d'arrière-plan. Notez qu'il existe des fonctions fréquemment utilisées avec UIImage qui ne sont pas sécurisées pour les threads, comme UIGraphicsBeginImageContext().