La suspension de PGCD requête problème
j'ai du mal à la suspension d'un pgcd de requête. Voici un code qui illustre le problème:
static dispatch_queue_t q=nil;
static void test(int a){
if(q){
dispatch_suspend(q);
dispatch_release(q);
q=nil;
}
q=dispatch_get_global_queue(0,0);
dispatch_async(q,^ {
while(1){NSLog(@"query %d",a);sleep(2);}
});
}
int main(int argc, const char* argv[]){
NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
test(1);
//blah blah blah
test(2);
while(1){}
[pool release];
return 0;
}
Ce que je suis en train de faire est de suspendre,de libération et de réinitialiser la requête q lorsque la fonction de test est appelé la deuxième fois, mais apparenty mon code est faux et les deux instances de la requête q continuer à exécuter.
Votre aide est très appréciée, merci.
- Vous pourriez voulez l'utilisation
NSOperationQueue
à la place.
Vous devez vous connecter pour publier un commentaire.
Tous les blocs qui ont été expédiés à votre file d'attente de manière asynchrone avant de vous appeler dispatch_suspend() va exécuter avant la suspension prend effet. Dans votre code vous de tirer un tas de blocs de manière asynchrone, de sorte que certains sont probablement encore dans la file d'attente lorsque vous appelez test(2), et ces blocs seront exécutées.
Si vous voulez être en mesure d'annuler votre travaux en cours d'exécution, vous aurez besoin de le faire dans votre propre logique. PGCD dessein n'est pas d'exposer une véritable annulation de l'API. Vous pourriez faire quelque chose comme ceci:
De cette façon, chaque bloc de conserver une référence à un objet qui sait si elle doit cesser de travailler.
test(1)
quandtest(2)
est exécuté? Parce qu'il ne l'arrête pas.D'Apple PGCD de Référence:
[gras mine]
Je suppose que c'est parce que quand un bloc est exécuté, il quitte la file d'attente. Donc, il semble que vous ne pouvez pas suspendre un bloc déjà en exécution.