2013-07-25 1 views
0

Je suis en train d'apprendre la programmation IOS Threading ... Je rencontré un problème:NSThread questions de programmation

vient ici mon code, s'il vous plaît avez bien voulu regarder:

int main(int argc, const char * argv[]) 
{ 
    @autoreleasepool { 
     NSThread *t1 = [[NSThread alloc]initWithTarget:[MyThread class] selector:@selector(myMethod:) object:Nil]; 
     [t1 start]; 
    } 
    return 0; 
} 

#import "MyThread.h" 

@implementation MyThread 

+ (void)myMethod:(id)param 
{ 
    @autoreleasepool { 
     NSLog(@"called..."); 
    } 
} 

@end 

Cependant, quand je courais mon programme , bien qu'il n'y ait pas eu d'erreur, aucun message n'a été imprimé sur la console. Il semble que myMethod n'a pas été exécuté. Je me demande si quelqu'un pourrait me donner des suggestions. Cela m'a déjà rendu fou.

Merci beaucoup à l'avance.

+0

Le 'target' devrait être une instance d'un objet IIRC –

Répondre

1

Le thread principal de votre application se ferme avant que votre autre thread ne puisse traiter quoi que ce soit.

Cela fonctionnera si vous ajoutez une instruction sleep(1000) n'importe où avant l'instruction return 0 dans votre méthode principale.

+0

Bonjour Harry, merci beaucoup pour votre réponse rapide. –

+0

Oui, Harry, tu as absolument raison. Je remarque juste cela et j'ai modifié mon code et j'ai vu mon nouveau thread créé. Je veux juste répondre à ma question mais j'ai trouvé que vous y avez répondu il y a quelques minutes. Encore une fois, je vous remercie beaucoup. –

+0

Aussi, vous devriez ajouter la méthode de sommeil dans isExecuting: do { sleep (100); } while (t1.isExecuting); –

1

Votre application se termine avant que le thread n'ait exécuté le NSLog.

NSThread crée un détaché fil, voir Thread Programming Guide d'Apple, dont est issu:

importants: Au moment de la sortie de l'application, les fils détachés peuvent être résiliés fils immédiatement, mais juxtaposables ne peut pas. Chaque thread joignable doit être joint avant que le processus ne puisse quitter. Les threads pouvant être joints peuvent donc être préférables dans les cas où le thread effectue un travail critique qui ne doit pas être interrompu, tel que l'enregistrement des données sur le disque.

Pour créer un fil jumelables, et donc d'être en mesure de bloquer votre fil conducteur jusqu'à ce que toutes les discussions juxtaposables ont terminé, vous utilisez pthread - couvert dans le Guide ci-dessus.

Le modèle de thread Java est similaire, mais utilise une terminologie légèrement différente. Par défaut, un thread Java est joignable et l'application Java continuera à s'exécuter jusqu'à ce que tous ces threads se terminent. Un thread Java peut être converti en un thread daemon, qui se termine automatiquement à la sortie de l'application, comme avec les threads NSThread.

+0

Merci beaucoup pour votre réponse. J'apprécie vraiment cela. J'ai une petite question: vous avez dit que nous pourrions créer un pThread qui pourrait bloquer mon thread principal. Je me demande ce que signifie block, est-ce que ça veut dire que le thread principal ne pouvait rien faire jusqu'à ce que pThread finisse? BTW, à partir de Java Side, j'utilise toujours le fil jointable comme ce que vous avez mentionné. Puis-je savoir comment le convertir en fil de démon? Et est-ce bon d'utiliser le thread démon dans java et pThread dans iOS? Encore une fois, je vous remercie beaucoup. –

+0

@DavidDai - désolé, j'aurais pu écrire un peu plus clair: avec un pthread vous pouvez * choisir * pour bloquer votre thread principal en attendant qu'un thread soit complet, vous n'avez pas à le faire! L'appel est 'pthread_join', avec une similitude évidente avec le modèle Java que vous connaissez. La méthode Java que vous recherchez est 'setDaemon'. – CRD

+0

Salut, merci beaucoup pour vos plus amples détails. C'est très utile. Je vous en suis reconnaissant. J'espère que vous passez une bonne nuit. –