Questo sito utilizza cookies, anche di terze parti, per mostrare pubblicità e servizi in linea con il tuo account. Leggi l'informativa sui cookies.
Username: Password: oppure
C/C++ - [C] Parametri da passare a CreateThread e casting
Forum - C/C++ - [C] Parametri da passare a CreateThread e casting

Avatar
c0rv0 (Normal User)
Newbie


Messaggi: 8
Iscritto: 05/09/2009

Segnala al moderatore
Postato alle 23:21
Giovedì, 16/09/2010
Questo topic è stato chiuso dal moderatore

Codice sorgente - presumibilmente Plain Text

  1. SOCKET sock;
  2. sock = Connessione(...);
  3.  
  4. {...}
  5.  
  6. HANDLE ThrdRispostaServer;
  7. DWORD dwThrdId;
  8. DWORD ThrdParam = sock;
  9.  
  10. 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:

Codice sorgente - presumibilmente C#

  1. DWORD WINAPI RispostaServer(LPVOID Parameter){
  2. SOCKET * sock = Parameter;
  3.  
  4.  
  5. printf("Sock in RispostaServer() %d\n",sock);
  6.  
  7. sleep(2000);
  8. while (1){
  9.  
  10.         char mess[3000]={0};
  11.         int n=0;
  12.         n = recv(sock,mess,2800,0);
  13.         if ( n < 0 ) exit (0);
  14.     mess[n]=0;
  15.         printf("%s",mess);
  16. sleep(1000);
  17. }
  18.        
  19.         ExitThread(0);
  20.  
  21. }



il valore di sock allinterno della funzione RispostaServer e' differente da quello passato. Dove sbaglio .. sicuramente il cast?

Ultima modifica effettuata da c0rv0 il 16/09/2010 alle 23:26
PM
Avatar
HeDo (Founder Member)
Guru^2


Messaggi: 2763
Iscritto: 21/09/2007

Segnala al moderatore
Postato alle 23:32
Giovedì, 16/09/2010

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ì:

Codice sorgente - presumibilmente Plain Text

  1. 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.


Ingegnere Informatico
https://ldlagency.it
PM
Avatar
c0rv0 (Normal User)
Newbie


Messaggi: 8
Iscritto: 05/09/2009

Segnala al moderatore
Postato alle 0:03
Venerdì, 17/09/2010
Ho risolto togliendo l'& ... e grazie

PM