Oppure

Loading
Questo topic e' stato chiuso dal moderatore.
16/09/10 21:21
c0rv0

SOCKET sock;
sock = Connessione(...);

{...}

HANDLE ThrdRispostaServer;
DWORD dwThrdId;
DWORD ThrdParam = sock;

ThrdRispostaServer = CreateThread (NULL, 0,(LPTHREAD_START_ROUTINE)RispostaServer,(LPVOID) &ThrdParam , 0, &dwThrdId);


vorrei passare alla funzione RispostaServer il parametro sock che e' un intero.
come faccio a fare il cast giusto visto che il 4° parametro della funz. CreateThread e' LPVOID

la funzione chiamata e' questa:

DWORD WINAPI RispostaServer(LPVOID Parameter){
SOCKET * sock = Parameter;


printf("Sock in RispostaServer() %d\n",sock);

sleep(2000);
while (1){

	char mess[3000]={0};
	int n=0;
	n = recv(sock,mess,2800,0);
	if ( n < 0 ) exit (0);
    mess[n]=0;
	printf("%s",mess);
sleep(1000);
}
	
	ExitThread(0);

}


il valore di sock allinterno della funzione RispostaServer e' differente da quello passato. Dove sbaglio .. sicuramente il cast?
Ultima modifica effettuata da c0rv0 16/09/10 21:26
aaa
16/09/10 21:32
HeDo

LPVOID vuol dire Puntatore a void, cioè un puntatore a qualsiasi tipo.

tu vuoi passare un semplice valore intero alla threadproc, in questo caso non è necessario allocare un "carrier" all'interno del quale inserire i valori, ma si può fare semplicemente così:

ThrdRispostaServer = CreateThread (NULL, 0,(LPTHREAD_START_ROUTINE)RispostaServer,(LPVOID) ThrdParam , 0, &dwThrdId)


cioè senza la &.

Il problema principale è che non si può passare un puntatore di una variabile locale ad una funzione che non è al di sotto del nostro stack di chiamate, ovvero si deve considerare lo scope della variabile come: funzione corrente + callees (quelli che vengono chiamati). La threadproc viene infatti eseguita al di fuori del nostro stack di chiamate, quindi semplicemente quell'indirizzo che gli passi non è più valido :)

po all'interno della funzione per ottenere il valore basta ricastare ad int l'lpvoid.
aaa
16/09/10 22:03
c0rv0
Ho risolto togliendo l'& ... e grazie
aaa