2010-04-13 2 views
0

J'ai écrit un programme qui fonctionnait en tant que serveur. Sachant que "accepter" bloquait le programme. Je voulais lancer un thread avec cette déclaration pour empêcher précisément que le programme bloqué, mais cela arrive encore. Quelqu'un peut-il aider? Code postal MerciMon bloc de programmes de threads

-(IBAction)Connetti{ 

    if(switchConnessione.on){ 

     int port = [fieldPort.text intValue]; 

     labelStatus.text = [[NSString alloc] initWithFormat:@"Il Server è attivo"]; 

     server_len = sizeof(server); 

     server.sin_family = AF_INET; 
     server.sin_port = htons((u_short)port); 
     server.sin_addr.s_addr = INADDR_ANY; 

     sd = socket (AF_INET, SOCK_STREAM, 0); 

     bind(sd, (struct sockaddr*)&server, sizeof(server)); 

     listen(sd, 1); 

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

     } 

    else { 
     labelStatus.text = [[NSString alloc] initWithFormat:@"Server non attivo"]; 

     switchChat.on = FALSE; 
     switchChat.enabled = FALSE; 
    } 

    } 

-(void)startThreadAccept{ 

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

    [self performSelectorOnMainThread:@selector(acceptConnection) withObject:nil waitUntilDone:NO]; 
    [pool release]; 

    } 

-(void)acceptConnection{ 

    new_sd = accept(sd, (struct sockaddr*)&server, &server_len); 
    labelStatus.text = [[NSString alloc] initWithFormat:@"Ho accettato una connessione:%d", new_sd]; 
    switchChat.enabled = TRUE; 



} 
+0

Est-ce qu'il se bloque ou bloque? Le titre et le corps de votre question ne sont pas d'accord. –

Répondre

0

Vous appelez toujours accept() sur le thread principal. Si vous souhaitez que la connexion soit acceptée sur un thread différent, vous devez supprimer l'appel -performSelectorOnMainThread:.

+0

Donc, cela pourrait être une bonne solution? (Ci-dessous) – zp26

0

ceci est mon nouvelles méthodes

- (IBAction) Connetti {

//code 
[NSThread detachNewThreadSelector:@selector(acceptConnection) toTarget:self withObject:nil]; 
//code 
} 

- (void) {acceptConnection

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

new_sd = accept(sd, (struct sockaddr*)&server, &server_len); 
labelStatus.text = [[NSString alloc] initWithFormat:@"Ho accettato una connessione:%d", new_sd]; 
switchChat.enabled = TRUE; 
[pool release]; 

} 

Il est une bonne solution? Pourquoi dans certaines occasions, le fil semble ne pas commencer? Merci

+0

C'est mieux, mais chaque acceptation fuit probablement une chaîne (en supposant que labelStatus est un objet et que le texte est une propriété retain ou copy sur cet objet). Vous voulez probablement [NSString stringWithFormat: ....] – JeremyP