Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1116 connectés 

  FORUM HardWare.fr
  Programmation
  C++

  [c++] probleme avec le mot clé static et les threads sous windows

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

[c++] probleme avec le mot clé static et les threads sous windows

n°651659
beusser
Posté le 23-02-2004 à 11:27:48  profilanswer
 

Bonjour,
J'utilise une méthode threadProc que je met en static comme on me l'a conseillé (merci au passage), j'ai aussi mis les variables de cette méthode en static. Le hic c que au moment du linking le compilo me met une erreur pour chacune de ces variables :  
 
Compiling...
SocketServeur 3 avec threads.cpp
Linking...
SocketServeur 3 avec threads.obj : error LNK2001: unresolved external symbol "private: static char * getFile::serverBuffer" (?serverBuffer@getFile@@0PADA)
SocketServeur 3 avec threads.obj : error LNK2001: unresolved external symbol "private: static int getFile::newSocket" (?newSocket@getFile@@0HA)
SocketServeur 3 avec threads.obj : error LNK2001: unresolved external symbol "private: static int getFile::j" (?j@getFile@@0HA)
SocketServeur 3 avec threads.obj : error LNK2001: unresolved external symbol "private: static int getFile::bytesReceived" (?bytesReceived@getFile@@0HA)
SocketServeur 3 avec threads.obj : error LNK2001: unresolved external symbol "private: static void * getFile::semaphoreHandle" (?semaphoreHandle@getFile@@0PAXA)
Debug/SocketServeur 3 avec threads.exe : fatal error LNK1120: 5 unresolved externals
Error executing link.exe.
 
SocketServeur 3 avec threads.exe - 6 error(s), 0 warning(s)
 
Pouvez vous m'aider ?


Message édité par beusser le 23-02-2004 à 11:29:39
mood
Publicité
Posté le 23-02-2004 à 11:27:48  profilanswer
 

n°651664
blackgodde​ss
vive le troll !
Posté le 23-02-2004 à 11:31:13  profilanswer
 

mmh ... tu aurais pu poster ds le mm topic hein :o
 
ca ca veut dire que tu as des fonctions membres déclarées mais pas définies.


---------------
-( BlackGoddess )-
n°651679
beusser
Posté le 23-02-2004 à 11:49:02  profilanswer
 

blackgoddess a écrit :

mmh ... tu aurais pu poster ds le mm topic hein :o
 
ca ca veut dire que tu as des fonctions membres déclarées mais pas définies.


 
oui c'est vrai, désolé
 
sinon pour en revenir au probleme, j'ai ma méthode définie comme suit :

Code :
  1. DWORD WINAPI getFile::threadProc(LPVOID lpParam)
  2. {
  3.    //code
  4. }


 
et déclarée comme ça :
 

Code :
  1. class machin
  2. {
  3.      //...
  4.      static DWORD WINAPI threadProc(LPVOID lpParam) ;
  5.      //...
  6. }


 
et serverBuffer, newSocket et les autres (mentionnés dans les erreurs) sont des variables de la méthode threadProc.
J'ai essayer de mettre static devant la définition de la méthode mais ça ne marche pas non plus (je ne connaissais pas ce mot clé avant).

n°651684
beusser
Posté le 23-02-2004 à 11:55:55  profilanswer
 

beusser a écrit :


 
oui c'est vrai, désolé
 
sinon pour en revenir au probleme, j'ai ma méthode définie comme suit :

Code :
  1. DWORD WINAPI getFile::threadProc(LPVOID lpParam)
  2. {
  3.    //code
  4. }


 
et déclarée comme ça :
 

Code :
  1. class machin
  2. {
  3.      //...
  4.      static DWORD WINAPI threadProc(LPVOID lpParam) ;
  5.      //...
  6. }


 
et serverBuffer, newSocket et les autres (mentionnés dans les erreurs) sont des variables de la méthode threadProc.
J'ai essayer de mettre static devant la définition de la méthode mais ça ne marche pas non plus (je ne connaissais pas ce mot clé avant).


 
j'ai oublié de préciser les variables static qui font partie de la fonction ThreadProc sont déclarées dans la classe en privé comme la methode threadProc.


Message édité par beusser le 23-02-2004 à 12:00:57
n°651693
blackgodde​ss
vive le troll !
Posté le 23-02-2004 à 12:05:57  profilanswer
 

mmh ... bin les variables sont static, déclarées mais pas définies ... ta pas du bien suivre l'exemple que je t'ai donné, sinon tu les aurais pas mise static ...
 
apparement tu saisies pas bien la diff entre static ou pas.
 
encore une fois :
 
seul ta threadproc est static, et recoit en param un ptr sur l'objet en cours (this) et elle appelle de suite une fonction membre (ou pas, si tu veux te taper des reinterpret_cast<getFile*>(lpParam) a tout va). on perd de l'information avec cette méthode (la constance par exemple) mais bon ...


---------------
-( BlackGoddess )-
n°651738
beusser
Posté le 23-02-2004 à 12:29:16  profilanswer
 

ben en fait, reinterpret_cast<getFile*>(lpParam), je n'ai pas appris ce que c'est, et je pensais m'en tirer juste en mettant les variables de la fonction en static. Sinon serveurBuffer est initialisé dans le constructeur comme newSocket et pourtant ils sont dans les messages d'erreurs  :sweat: .N'y aurait-il pas une solution plus simple que reinterpret_cast<getFile*>(lpParam) ?
Avant j'avais des erreurs après avoir mis threadProc en static, c pour ça que j'en suis arrivé a mettre les variables aussi en static.

n°651748
blackgodde​ss
vive le troll !
Posté le 23-02-2004 à 12:35:09  profilanswer
 

raaah
 
comme je disais, tu déclare pas des machins en static
 

Code :
  1. class ma_classe
  2.   {
  3.       void new_thread()
  4.       {
  5.            DWORD ThreadID;
  6.            HANDLE hThread = CreateThread(NULL, 0, internal_threadentry, this, 0, &ThreadID);
  7.            CloseHandle(hThread);
  8.       }
  9.    
  10.       static DWORD WINAPI internal_threadentry(LPVOID lpParam)
  11.       {
  12.           (reinterpret_cast<ma_classe*>lpParam)->threadentry();
  13.           return 0;
  14.       }
  15.    
  16.       void threadentry()
  17.       {
  18.       }
  19.   };


 
pour reprendre hein :o
 
newthread => exemple pour créer un thread "membre"
 
static DWORD WINAPI internal_threadentry(LPVOID lpParam) => tu as pas besoin d'y toucher, c la seule fonction static, elle permet juste de retomber dans ton objet avec le param (super mon explication :/)
 
void threadentry() => la dedans tu reprends ce que tu mettais dans getFile::threadProc, elle n'est pas static donc tu peux utiliser les membres de ton objet.


---------------
-( BlackGoddess )-
n°651791
beusser
Posté le 23-02-2004 à 13:16:40  profilanswer
 

blackgoddess a écrit :

raaah
 
comme je disais, tu déclare pas des machins en static
 

Code :
  1. class ma_classe
  2.   {
  3.       void new_thread()
  4.       {
  5.            DWORD ThreadID;
  6.            HANDLE hThread = CreateThread(NULL, 0, internal_threadentry, this, 0, &ThreadID);
  7.            CloseHandle(hThread);
  8.       }
  9.    
  10.       static DWORD WINAPI internal_threadentry(LPVOID lpParam)
  11.       {
  12.           (reinterpret_cast<ma_classe*>lpParam)->threadentry();
  13.           return 0;
  14.       }
  15.    
  16.       void threadentry()
  17.       {
  18.       }
  19.   };


 
pour reprendre hein :o
 
newthread => exemple pour créer un thread "membre"
 
static DWORD WINAPI internal_threadentry(LPVOID lpParam) => tu as pas besoin d'y toucher, c la seule fonction static, elle permet juste de retomber dans ton objet avec le param (super mon explication :/)
 
void threadentry() => la dedans tu reprends ce que tu mettais dans getFile::threadProc, elle n'est pas static donc tu peux utiliser les membres de ton objet.


 
ok merci, j'ai compris ! je vais essayer

n°652078
beusser
Posté le 23-02-2004 à 16:37:06  profilanswer
 

ça marche pas, g fé comme t'as dis mais g ça comme erreurs (sachant que threadProgram() c'est ton threadEntry() :
 
error C2061: syntax error : identifier 'lpParam'
d:\téléchargement earthnet\tms\programme\sockets\socket serveur\socketserveur 3 avec threads.cpp(108) : error C2146: syntax error : missing '(' before identifier 'lpParam'
d:\téléchargement earthnet\tms\programme\sockets\socket serveur\socketserveur 3 avec threads.cpp(108) : error C2227: left of '->threadProgram' must point to class/struct/union
Error executing cl.exe.
 
SocketServeur 3 avec threads.exe - 3 error(s), 0 warning(s)

n°652152
blackgodde​ss
vive le troll !
Posté le 23-02-2004 à 17:03:58  profilanswer
 

msui loupé ds la syntaxe, dsl :/
 
remplace
(reinterpret_cast<ma_classe*>lpParam)->threadentry();
par
(reinterpret_cast<ma_classe*>(lpParam))->threadentry();


---------------
-( BlackGoddess )-
mood
Publicité
Posté le 23-02-2004 à 17:03:58  profilanswer
 

n°652828
beusser
Posté le 24-02-2004 à 11:15:45  profilanswer
 

blackgoddess a écrit :

msui loupé ds la syntaxe, dsl :/ Sinon je viens de trouver qu'en mettant les var
 
remplace
(reinterpret_cast<ma_classe*>lpParam)->threadentry();
par
(reinterpret_cast<ma_classe*>(lpParam))->threadentry();
 


 
j'ai fait la modif' mais maintenant g les même erreurs qu'au début :-/
 
Linking...
Copie de SocketServeur 3 avec threads aide hfr.obj : error LNK2001: unresolved external symbol "private: static char * getFile::serverBuffer" (?serverBuffer@getFile@@0PADA)
Copie de SocketServeur 3 avec threads aide hfr.obj : error LNK2001: unresolved external symbol "private: static int getFile::newSocket" (?newSocket@getFile@@0HA)
Copie de SocketServeur 3 avec threads aide hfr.obj : error LNK2001: unresolved external symbol "private: static int getFile::j" (?j@getFile@@0HA)
Copie de SocketServeur 3 avec threads aide hfr.obj : error LNK2001: unresolved external symbol "private: static int getFile::bytesReceived" (?bytesReceived@getFile@@0HA)
Copie de SocketServeur 3 avec threads aide hfr.obj : error LNK2001: unresolved external symbol "private: static void * getFile::semaphoreHandle" (?semaphoreHandle@getFile@@0PAXA)
Debug/Copie de SocketServeur 3 avec threads aide hfr.exe : fatal error LNK1120: 5 unresolved externals
Error executing link.exe.
 
Copie de SocketServeur 3 avec threads aide hfr.exe - 6 error(s), 0 warning(s)

n°652989
blackgodde​ss
vive le troll !
Posté le 24-02-2004 à 12:55:46  profilanswer
 

mets les pas static toutes ces fonctions ou ces variables, et si c'est des fonctions définies-les

n°653132
beusser
Posté le 24-02-2004 à 14:21:55  profilanswer
 

BlackGoddess a écrit :

mets les pas static toutes ces fonctions ou ces variables, et si c'est des fonctions définies-les


 
ok merci, ça compile mais le hic c que a l'exécution mon prog ne reçoit plus le fichier envoyé(car j'envoi un du client vers le serveur qui contient les threads) et windows me met une erreur type "envoyer le rapport d'erreurs"  :(


Message édité par beusser le 24-02-2004 à 14:28:41
n°653585
blackgodde​ss
vive le troll !
Posté le 24-02-2004 à 19:31:39  profilanswer
 

mmh ... bin ta un pb dans ton code, un access violation surement :p => utilisation d'un pointeur pointant ds le vent.

n°656469
beusser
Posté le 26-02-2004 à 16:08:50  profilanswer
 

BlackGoddess a écrit :

mmh ... bin ta un pb dans ton code, un access violation surement :p => utilisation d'un pointeur pointant ds le vent.


 
ok g trouvé, c t pasque javé pas fé nomClasse::nomVariableStatic
merci quand même.


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  C++

  [c++] probleme avec le mot clé static et les threads sous windows

 

Sujets relatifs
Problème de formatage en voulant passer de windows 98 à XP[PHP] url rewriting : probleme de recup des paramètres [Résolu]
[Resolu][JAVA]Problème de try catch et if elseproblème pour lire ma base de données, PROBLEME REGLE ;)
Probleme avec MD5problème avec les threads (associés aux sockets) sous windows
Problème avec un tableau et un require inclus dedans.. 
Plus de sujets relatifs à : [c++] probleme avec le mot clé static et les threads sous windows


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR