Pb avec CreateThread()

Signaler
Messages postés
627
Date d'inscription
mercredi 16 juin 2004
Statut
Membre
Dernière intervention
24 juillet 2011
-
Messages postés
21042
Date d'inscription
jeudi 23 janvier 2003
Statut
Modérateur
Dernière intervention
21 août 2019
-
Bonsoir tout le monde, c'est encore moi!
Voila voilou, j'ai un petit pb ac la fct CreateThread().
Je vous laisse regarder...

/* fichier de définition de la classe TConnect... */

// instructions

static DWORD _stdcall WaitForData(LPVOID pv) {
 
  TConnect s = (TConnect) pv;
 
  char buffer[500];
  int size = sizeof(s->addr);
  
  while(1) {
  
   ZeroMemory(buffer, sizeof(buffer));
   recvfrom(s->sock, buffer, sizeof(buffer), 0, (SOCKADDR*) &s->addr, &size);       
  }             
 }
 
bool TConnect::setUDPServer() {
 
  addr.sin_family = AF_INET;
  addr.sin_port = htons(port);
  addr.sin_addr.s_addr = htonl(INADDR_ANY);
  
  bind(sock, (SOCKADDR*) &addr, sizeof(addr));
  
  DWORD dwStat;
  CreateThread(0, 0, this->WaitForData, (LPVOID) this, 0, &dwStat);                    
 }

// autres instructions

/* fichier .h de la classe */

// instructions

  public:            
    
    static DWORD _stdcall WaitForData(LPVOID pv);
    
    bool setUDPServer();    
    void setPort(int _port);

//instructions


Le pb est que le compilo refuse de compiler ça! J'aimerais, comme vous le voyez que la fonction appelée par CreateThread soit une fonction de la classe et ce, parce que j'ai besoin de lui transmettre un objet TConnect! SI je la déclare à l'extérieur, j'ai également un souci : cannot convert void* to TConnect
(lorsque j'essaie le transtypage de LPVOID pv en TConnect...)

Merci de bien voulir m'aider! Si vous avez des questions ou voulez des précisions, n'hésitez pas! Merci à tous par avance! :)

Gendal67, Dev-C++ 4.9.9.0, J'adore cppfrance!! :-))

8 réponses

Messages postés
21042
Date d'inscription
jeudi 23 janvier 2003
Statut
Modérateur
Dernière intervention
21 août 2019
24
fonction membre de classe doit etre declaree 'static', compilo doit savoir son adresse a la compilation.

TConnect s = (TConnect) pv;
c'est quoi ce bidule ? si c'est une classe, sers toi de _beginthreadex() au lieu de CreateThread sinon fuites de memoire a prevoir, le CRT ne saura pas quand appeler le destructeur.

ciao...
BruNews, MVP VC++
Messages postés
627
Date d'inscription
mercredi 16 juin 2004
Statut
Membre
Dernière intervention
24 juillet 2011

Euh, mais elle est déja déclarée static ds mon exemple, nan ?

public:

static DWORD _stdcall WaitForData(LPVOID pv);

:)

Gendal67, Dev-C++ 4.9.9.0, J'adore cppfrance!! :-))
Messages postés
6535
Date d'inscription
lundi 16 décembre 2002
Statut
Modérateur
Dernière intervention
22 août 2010
7
et pourquoi pas
static DWORD _stdcall TConnect::WaitForData(LPVOID pv);

?
C'est une fonction statique, mais elle fait quand même partie de la classe...

<table border=0 cellspacing=0 cellpadding=4 bgcolor=#E0E0E0><tr><td class=code>
CreateThread(0, 0, this->WaitForData, (LPVOID) this, 0, &dwStat);
<table border=0 cellspacing=0 cellpadding=4 bgcolor=#E0E0E0><tr><td class=code>
this->WaitForData n'a aucun sens puisque la fonction est statique.
A remplacer par TConnect::WaitForData
Messages postés
2070
Date d'inscription
mardi 22 avril 2003
Statut
Membre
Dernière intervention
3 juillet 2006
8
Si tu passe un pointeur en param de CreateThread, caste en pointeur :
TConnect* s = (TConnect*) pv;
Messages postés
627
Date d'inscription
mercredi 16 juin 2004
Statut
Membre
Dernière intervention
24 juillet 2011

"cannot declare member function 'static DWORD TConnect::
WaitForData(void*)' to have a static linkage"

<<< ?

Gendal67, Dev-C++ 4.9.9.0, J'adore cppfrance!! :-))
Messages postés
6535
Date d'inscription
lundi 16 décembre 2002
Statut
Modérateur
Dernière intervention
22 août 2010
7
Le programme suivant marche très bien:

#include <winsock2.h>

#pragma comment(lib, "ws2_32.lib")

class TConnect
{
public:

static DWORD _stdcall WaitForData(LPVOID pv);

bool setUDPServer();
void setPort(int _port);
};

DWORD _stdcall TConnect::WaitForData(LPVOID pv) 
{
TConnect* s = (TConnect*) pv;
return 0;
}

bool TConnect::setUDPServer()
{
DWORD dwStat;
CreateThread(0, 0, WaitForData, (LPVOID) this, 0, &dwStat);
return true;
}

int main()
{
}
Messages postés
627
Date d'inscription
mercredi 16 juin 2004
Statut
Membre
Dernière intervention
24 juillet 2011

oui, lol, je sais, j'ai trouvé ou était le pb! mdr! j'avais remis
le 'static' dans la définion de WaitForData c pr sa ^^

la sa marche mais ça n'appelle pas la fonction :((

Gendal67, Dev-C++ 4.9.9.0, J'adore cppfrance!! :-))
Messages postés
21042
Date d'inscription
jeudi 23 janvier 2003
Statut
Modérateur
Dernière intervention
21 août 2019
24
Pensez a tester si vos destructeurs sont correctement
appeles et la memoire de la classe vraiment liberee.

ciao...
BruNews, MVP VC++