ShellC91 (Normal User)
Newbie
Messaggi: 15
Iscritto: 29/06/2010
|
Salve a tutti mi chiedevo se usando la CreateThread di windows.h sia possibile lanciare un numero indefinito di threads a partire da una determinata funzione, e se è possibile come si potrebbe fare...
Mi spiego meglio:
Io ho questa "funzione" da lanciare come thread:
Codice sorgente - presumibilmente C/C++ |
DWORD WINAPI Receive(LPVOID Parameter)
{
SOCKET* cl_desc = Parameter;
while(1)
{
if(!ReceiveString(cl_desc)) break;
}
N_Threads--;
return 0;
}
|
E devo aprire più di un thread (il numero è indefinito), in modo che ad ogni connessione venga aperto il thread che si occupa di ricevere le stringhe.
Posso passare semplicemente ogni volta il descrittore del socket richiamando sempre la stessa funzione in questo modo
Codice sorgente - presumibilmente Plain Text |
CreateThread(NULL,0,(LPTHREAD_START_ROUTINE)Receive,&sock_descriptor,0,&dwThreadId);
|
Oppure c'è un procedimento particolare??
Ringrazio tutti in anticipo, se mi sono spiegato male fatemelo sapere che mi spiego meglio. |
|
nessuno (Normal User)
Guru^2
Messaggi: 6402
Iscritto: 03/01/2010
|
Ricorda che nessuno è obbligato a risponderti e che nessuno è perfetto ...
---
Il grande studioso italiano Bruno de Finetti ( uno dei padri fondatori del moderno Calcolo delle probabilità ) chiamava il gioco del Lotto Tassa sulla stupidità. |
|
ShellC91 (Normal User)
Newbie
Messaggi: 15
Iscritto: 29/06/2010
|
Ok grazie per il consiglio,
per quanto riguarda il lancio di più thread (numero indefinito) che usano la stessa porzione di codice (funzione) si può fare?
|
|
nessuno (Normal User)
Guru^2
Messaggi: 6402
Iscritto: 03/01/2010
|
Ricorda che nessuno è obbligato a risponderti e che nessuno è perfetto ...
---
Il grande studioso italiano Bruno de Finetti ( uno dei padri fondatori del moderno Calcolo delle probabilità ) chiamava il gioco del Lotto Tassa sulla stupidità. |
|
ShellC91 (Normal User)
Newbie
Messaggi: 15
Iscritto: 29/06/2010
|
Grazie, comunque il problema praticamente è questo: usando i socket io devo consentire al server di accettare OGNI connessione e passare il descrittore del client appena connesso a un thread che si occupi di ricevere i messaggi. E questo lo devo fare per tutti i client che si connettono.
Codice sorgente - presumibilmente C/C++ |
...
while(1)
{
sc = accept(ss,NULL,NULL);
CreateThread(NULL,0,(LPTHREAD_START_ROUTINE)Receive,&sc,0,&dwThreadId);
}
...
|
Codice sorgente - presumibilmente C/C++ |
DWORD WINAPI Receive(LPVOID Parameter)
{
SOCKET* cl_desc = Parameter;
while(1)
{
if(!ReceiveString(cl_desc)) break;
}
N_Threads--;
return 0;
}
|
E' fattibile una cosa del genere? Devo usare _beginthreadex ?
Grazie di tutto. Ultima modifica effettuata da ShellC91 il 04/07/2010 alle 14:47 |
|
nessuno (Normal User)
Guru^2
Messaggi: 6402
Iscritto: 03/01/2010
|
1) Controlla il valore restituito dalla accept, perché potrebbe esserci un errore e il valore di sc non è valido ...
2) Non usare direttamente sc ma assegna il suo valore ad un nuovo elemento di un array di socket e passa il nuovo indice usato al nuovo thread
3) usa la _beginthreadex
Ricorda che nessuno è obbligato a risponderti e che nessuno è perfetto ...
---
Il grande studioso italiano Bruno de Finetti ( uno dei padri fondatori del moderno Calcolo delle probabilità ) chiamava il gioco del Lotto Tassa sulla stupidità. |
|
ShellC91 (Normal User)
Newbie
Messaggi: 15
Iscritto: 29/06/2010
|
ok la 1 e la 3 chiarissime, farò così.
Per quanto riguarda la 2 dovrò comunque aprire un thread per ogni connessione?
|
|
nessuno (Normal User)
Guru^2
Messaggi: 6402
Iscritto: 03/01/2010
|
Che vuoi dire? Certo! E' questo l'oggetto di questa discussione ... o no?
Ricorda che nessuno è obbligato a risponderti e che nessuno è perfetto ...
---
Il grande studioso italiano Bruno de Finetti ( uno dei padri fondatori del moderno Calcolo delle probabilità ) chiamava il gioco del Lotto Tassa sulla stupidità. |
|
ShellC91 (Normal User)
Newbie
Messaggi: 15
Iscritto: 29/06/2010
|
Sì proprio quello!
Comunque ritornando a prima io praticamente prima di tutto controllo se l'accept ritorna un socket valido, quindi lo inserisco in un array (o una lista dinamica) e apro un nuovo thread passando la posizione nella lista o nell'array.
Ok grazie di tutto ho capito
|
|