2010-03-11 5 views
0

J'ai un problème avec ce code.Basiquement, je veux exécuter le fwrite à partir d'une fonction de minuterie asyncronusly.NSOperation et fwrite (Iphone)

Voici le bloc de code dans ma fonction Minuterie. (Ceci appellera par la minuterie tous la méthode 0,2 seconde.

-(void)timerFunction 
{ 

     WriteFileOperation * operation = 
     [WriteFileOperation writeFileWithBuffer:pFile buffer:readblePixels length:nBytes*15]; 
     [_queue addOperation:operation]; // Here it is waiting to complete the fwrite 
} 

Le WrtiteFilerOperation est une classe NSOperation qu'il doit écrire le tampon de passage dans un fichier. J'ai ajouté ce code dans « Démarrer » WriteFileOperation.

- (void)start 

{ 

    if (![NSThread isMainThread]) 
    { 
     [self performSelectorOnMainThread:@selector(start) withObject:nil waitUntilDone:NO]; 
     return; 
    } 


    [self willChangeValueForKey:@"isExecuting"]; 
    _isExecuting = YES; 
    [self didChangeValueForKey:@"isExecuting"]; 

    NSLog(@"write bytes %d",fwrite(_buffer, 1, _nBytes, _file)); 
    free(_buffer); 
    [self finish]; 
} 

le problème est ici, mon timerFunction bloqué par NSOperation jusqu'à ce qu'il écrit le tampon dans le fichier. (je veux dire bloqué jusqu'à ce que la méthode de démarrage se termine son exécution) et la performance semble même que placer directement le fwrite dans timerFunction.

Je veux juste revenir à timerFunction sans attendre l'exécution de la méthode start.

Qu'est-ce que je fais mal ici?

Merci à l'avance

Raghu

Répondre

1

Votre opération bloque parce que vous forcez l'opération à exécuter sa méthode start sur le thread principal, en supprimant les avantages de l'utilisation d'un NSOperationQueue. Au lieu de cela, je vous recommande de retirer la mise en œuvre -start que vous voyez ci-dessus et déplacer le code à -main:

- (void)main 
{ 
    NSLog(@"write bytes %d",fwrite(_buffer, 1, _nBytes, _file)); 
    free(_buffer); 
    [self finish]; 
} 

Le NSLog doit être retiré à un moment donné pour améliorer les performances. Vous devrez peut-être également inclure ce qui précède dans un NSAutoreleasePool si vous en faites plus que cela.

Afin d'éviter plusieurs threads d'écrire dans le fichier en même temps, vous devez définir le nombre maximum d'opérations simultanées à 1 en utilisant le code comme le suivant:

[_queue setMaxConcurrentOperationCount:1];