Pb avec CreateThread()

Gendal67 Messages postés 627 Date d'inscription mercredi 16 juin 2004 Statut Membre Dernière intervention 24 juillet 2011 - 8 déc. 2004 à 23:48
BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019 - 10 déc. 2004 à 00:09
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

BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
9 déc. 2004 à 00:47
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++
0
Gendal67 Messages postés 627 Date d'inscription mercredi 16 juin 2004 Statut Membre Dernière intervention 24 juillet 2011 2
9 déc. 2004 à 01:19
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!! :-))
0
vecchio56 Messages postés 6535 Date d'inscription lundi 16 décembre 2002 Statut Membre Dernière intervention 22 août 2010 14
9 déc. 2004 à 08:29
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
0
ymca2003 Messages postés 2070 Date d'inscription mardi 22 avril 2003 Statut Membre Dernière intervention 3 juillet 2006 7
9 déc. 2004 à 08:56
Si tu passe un pointeur en param de CreateThread, caste en pointeur :
TConnect* s = (TConnect*) pv;
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
Gendal67 Messages postés 627 Date d'inscription mercredi 16 juin 2004 Statut Membre Dernière intervention 24 juillet 2011 2
9 déc. 2004 à 16:40
"cannot declare member function 'static DWORD TConnect::
WaitForData(void*)' to have a static linkage"

<<< ?

Gendal67, Dev-C++ 4.9.9.0, J'adore cppfrance!! :-))
0
vecchio56 Messages postés 6535 Date d'inscription lundi 16 décembre 2002 Statut Membre Dernière intervention 22 août 2010 14
9 déc. 2004 à 23:45
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()
{
}
0
Gendal67 Messages postés 627 Date d'inscription mercredi 16 juin 2004 Statut Membre Dernière intervention 24 juillet 2011 2
9 déc. 2004 à 23:56
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!! :-))
0
BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
10 déc. 2004 à 00:09
Pensez a tester si vos destructeurs sont correctement
appeles et la memoire de la classe vraiment liberee.

ciao...
BruNews, MVP VC++
0
Rejoignez-nous