2013-07-05 4 views
0

j'ai un problème ...NSThread dans MainThread

Je en ai besoin:

Créer un nouveau fil, et une pause, il (en attente d'une notification de la MainThread). Dans MainThread, appuyez sur un déclencheur pour reprendre ce fil d'arrière-plan.

En MainThread:

[NSThread detachNewThreadSelector:@selector(startTheBackgroundJob:) toTarget:self withObject:nil]; 

en fil de fond:

- (void) startTheBackgroundJob { 
    @autoreleasepool { 

     NSLog(@"+ Thread %@ started and waiting.", self.identifier); 
     // Pause Here 
     NSLog(@"- Thread %@ unlocked", self.identifier); 

     [Scheduler doneTransaction: self]; 
    } 
} 

MainThread:

- (void) unlock { 
    // resume a background thread 
} 

J'ai essayé NSLock, NSConditionLock et Sémaphore GCD ....

+0

Comment avez-vous essayé d'utiliser des verrous et des sémaphores, montrez ce code. – Wain

+0

@Wain https://gist.github.com/iagocc/b2086b0abc329d46abca –

+0

Je suppose que l'ARC libère prématurément le sémaphore. Essayez de faire l'attribut __strong. – Wain

Répondre

0

C'est le scénario classique lorsque vous avez besoin d'utiliser un NSCondition objet. Le fil doit attendre jusqu'à ce qu'une condition est vrai, de sorte que vous atteindre cet objectif en utilisant verrouillage, attendre et signaux:

[sharedCondition lock]; 
while(!go) 
{ 
    [sharedCondition wait]; 
} 
[sharedCondition unlock]; 

Pour informer le fil que vous devez signaler la condition:

[sharedCondition lock]; 
go= YES; 
[sharedCondition signal]; 
[sharedCondition unlock]; 
+0

J'ai essayé, pas de travail ici: https://gist.github.com/iagocc/b4910a2dba109452d80e Merci. –

+0

J'ai essayé votre code et cela fonctionne: il imprime: "+ Thread Transaction 1 a commencé et en attente." et "- Thread Transaction 1 déverrouillé". Donc, je suppose que votre code ne fonctionne pas ailleurs, probablement dans la classe que les appels commencent et déverrouillent. Je suggère d'y mettre un point d'arrêt pour voir ce qui se passe pendant que vous appelez ces méthodes. –

+0

Oui, pareil pour moi. J'ai eu le code ci-dessus pour fonctionner, bien que j'ai enlevé la boucle while et l'un des "unlock" des appels. Ramy - Y at-il une raison particulière pour laquelle vous avez appelé [sharedCondition unlock] après la boucle while? https: //gist.github.com/meacreatio/5937894 –

0

Un Ce que vous pouvez faire est de mettre votre thread d'arrière-plan dans une boucle while. Une fois que votre thread principal atteint le point où vous voulez permettre à votre thread d'arrière-plan de continuer, vous coupez simplement votre thread d'arrière-plan hors de la boucle while. Par exemple:

... 
self.stayInLoop = YES; // BOOL in header - initialized before your thread starts 
... 

- (void)startTheBackgroundJob { 
    while (stayInLoop) { 
     // here your background thread stays in this loop (waits) until you 
     // change the flag 
    } 
    // more background thread code to be executed after breaking out of the loop 
} 

- (void)unlock { 
    self.stayInLoop = NO; 
} 
+0

Au moins mettre un retard/sommeil dans la boucle. – Wain

+0

Pourquoi est-ce nécessaire? –

+0

Parce que sinon le thread d'arrière-plan s'exécutera en continu et prendra tout le temps CPU (au moins pour 1 coeur de processeur). – Wain