View Single Post
Old 24-07-2005, 14:54   #2
fek
Senior Member
 
L'Avatar di fek
 
Iscritto dal: Oct 2002
Cittā: San Jose, California
Messaggi: 11794
Metti il ciclo di accept in un altro thread che fa da Boss, in una configurazione Boss-Worker. I Worker sono i thread che si occupano delle connessioni, il Boss si occupa di fare l'accept e smistare il lavoro.

Un'altra soluzione (che puo' essere usata assieme a questa che ti ho detto) e' usare socket "non bloccanti". Invece di bloccare l'esecuzione sull'accept, fai un "polling" sul socket, chiedendo ad ogni ciclo se e' disponibile una connessione, se lo e' crei un thread, altrimenti ripeti il ciclo in una forma di questo tipo (pseudo codice):

Codice:
  while (!QuitServer())
  {  
    if (IsConnectionAvailable())
    {
       thread = CreateThread();
       thread.HandleConnection();    
    }
    
    ReleaseCPUToAnotherThread();
  }

  WaitForAllConnectionsToFinish();
IsConnectionAvailable() non e' bloccante e ritorna true se c'e' una connessione in ingresso, altrimenti ritorna subito false. Guarda la documentazione Java per usare socket non bloccanti.

La GUI puo' lanciare il thread del server e impostare una flag testata da QuitServer() quando il thread del server deve fermarsi.
fek č offline   Rispondi citando il messaggio o parte di esso