2010-04-13 6 views
0

J'ai un problème avec threads objectifC. La ligne de code ci-dessous contient le recv qui bloque le programme en attente d'une donnée. Mon intention est de lancer un thread parallèle au programme afin que cette instruction ne bloque aucune application. Je mets ce code dans mon programme mais quand il est actif, le programme plante. Entrez le code.Mes programmes de thread Crash

- (IBAction) Chat {

if(switchChat.on){ 

     buttonInvio.enabled = TRUE; 
     fieldInvio.enabled = TRUE; 

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

    } 
    else { 
     buttonInvio.enabled = FALSE; 
     fieldInvio.enabled = FALSE; 
    } 

- (void) {riceviDatiServer

NSAutoreleasePool *pool = [[NSAutoreleasePool alloc]init]; 

    int ricevuti; 
    NSString *datiRicevuti; 
    ricevuti = recv(temp, &datiRicevuti, datiRicevuti.length, 0); 
    labelRicezione.text = [[NSString alloc] initWithFormat:@"%s.... %d", datiRicevuti, ricevuti]; 

    [pool release]; 

} 
+0

en double (même utilisateur): http://stackoverflow.com/questions/2628943 –

+0

double possible de http://stackoverflow.com/questions/2628943/my- thread-programs-block –

+0

Ce n'est pas le même problème. – zp26

Répondre

1

Cette partie

NSString *datiRicevuti; 
ricevuti = recv(temp, &datiRicevuti, datiRicevuti.length, 0); 

est clairement mauvaise. NSString* n'est pas un tampon C. Donc, vous ne devriez pas passer cela à recv. Ce que vous devez faire est recv les données tout comme en C (voir la documentation pour recv). Dites qu'il est maintenant dans void*receivedData et sa longueur est dataLength. Ensuite, le convertir en NSString par quelque chose comme

NSString*dataAsNSString=[[NSString alloc] initWithBytes:receivedData 
              length:dataLength encoding:NSISOLatin1StringEncoding]; 
+0

Je suis désolé mais mon problème n'est pas résolu, en effet, le programme se bloque lorsque vous activez l'instruction. J'espère que ce n'est pas mal compris. Merci quand même. – zp26

+3

Salut zp26, d'accord, ce n'était pas le seul problème. Ensuite, nous devons chercher d'autres problèmes. Mais rappelez-vous, nous ne sommes pas des médiums, alors nous ne comprenons pas ce qui se passe quand vous dites "activer la déclaration" ou "ça plante". Nous avons besoin d'informations plus détaillées pour comprendre ce qui se passe. Par exemple, vous pouvez citer le rapport d'erreur dans la publication sur StackOverflow. Il contient beaucoup d'informations utiles si vous pouvez le lire. S'il vous plaît essayer de penser à ce que les autres ont besoin afin de diagnostiquer le problème dans votre code. – Yuji

+0

Je voudrais ajouter aux commentaires de Yuji, quand vous dites "il se bloque", ce n'est pas assez d'informations. Nous devons savoir exactement quel type d'accident vous avez. Est-ce EXC_BAD_ACCESS ou une autre erreur? Sur quelle ligne cela se passe-t-il? NB: même dans la réponse de Yuji, il n'a pas tout fait pour toi. Vous devez clairement allouer de l'espace pour receiveData. Vous ne pouvez pas simplement passer un pointeur vide non initialisé. – JeremyP