J'ai une application qui dessine des lignes sur un contexte de quartz. L'application commence à dessiner lorsque l'utilisateur déplace son doigt sur l'écran. Au moment où TouchesMoved est déclenché, je sauvegarde le contexte de quartz dans un fichier PNG (je sais que l'enregistrement d'un fichier est lent ... J'ai essayé de le faire en mémoire mais l'utilisation de la mémoire de l'application est montée en flèche, donc j'essaie le faire sur disque).iphone - le fil principal gèle pendant une demi-seconde ... pourquoi?
Le contexte est en cours d'enregistrement à cela, je le fais sur des touches déplacé
if (firstMove) // first movement after touchesbegan
[NSThread detachNewThreadSelector:@selector(newThreadUNDO)
toTarget:self
withObject:nil];
firstMove = NO
}
puis je
- (void) newThreadUNDO {
NSAutoreleasePool* p = [[NSAutoreleasePool alloc] init];
[NSThread setThreadPriority:0.1];
[NSThread sleepForTimeInterval:0.0];
[self performSelectorOnMainThread:@selector(copyUNDOcontext) withObject:nil waitUntilDone:NO];
[p release];
}
et
- (void) copyUNDOcontext {
CGFloat w = board.image.size.width;
CGFloat h = board.image.size.height;
CGRect superRect = CGRectMake(0,0, w, h);
CGSize size = CGSizeMake(w, h);
UIGraphicsBeginImageContext(size);
CGContextRef new = UIGraphicsGetCurrentContext();
// lineLayer is the layer context I need to save
CGContextDrawLayerInRect(new, superRect, lineLayer);
UIImage *imagem = UIGraphicsGetImageFromCurrentImageContext();
[self saveTempImage:imagem :@"UNDO.png"];
UIGraphicsEndImageContext();
}
Le problème est: que Dès que l'utilisateur commence à se déplacer, le nouveau thread est déclenché, mais même ce nouveau thread étant de faible priorité, le thread principal reste figé pour environ une demi-seconde (probablement pendant l'enregistrement du fichier).
Pourquoi est-ce?
Comment puis-je résoudre ce problème?
merci.
merci! fonctionne comme un charme! – SpaceDog
Content que cela fonctionne. Dans le futur, vous voudrez peut-être créer un pool de threads. De cette façon, vous n'allouez pas un pool de versions et threadez plusieurs fois. Cependant, iOS peut très bien avoir un pool de threads en arrière-plan qui renvoie les threads disponibles (ou globaux) aux allocations. Je dirais plus sur iOS 4 que sur GCD. À tout le moins, vous économiserez quelques cycles de cpu. Gardez à l'esprit que toucher du cacao d'un autre fil peut devenir une situation inconfortable. –