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

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

Marsh Posté le 23-02-2004 à 11:27:48    

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
Reply

Marsh Posté le 23-02-2004 à 11:27:48   

Reply

Marsh Posté le 23-02-2004 à 11:31:13    

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 )-
Reply

Marsh Posté le 23-02-2004 à 11:49:02    

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

Reply

Marsh Posté le 23-02-2004 à 11:55:55    

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
Reply

Marsh Posté le 23-02-2004 à 12:05:57    

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 )-
Reply

Marsh Posté le 23-02-2004 à 12:29:16    

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.

Reply

Marsh Posté le 23-02-2004 à 12:35:09    

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 )-
Reply

Marsh Posté le 23-02-2004 à 13:16:40    

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

Reply

Marsh Posté le 23-02-2004 à 16:37:06    

ç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)

Reply

Marsh Posté le 23-02-2004 à 17:03:58    

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


---------------
-( BlackGoddess )-
Reply

Marsh Posté le 23-02-2004 à 17:03:58   

Reply

Marsh Posté le 24-02-2004 à 11:15:45    

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)

Reply

Marsh Posté le 24-02-2004 à 12:55:46    

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

Reply

Marsh Posté le 24-02-2004 à 14:21:55    

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
Reply

Marsh Posté le 24-02-2004 à 19:31:39    

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

Reply

Marsh Posté le 26-02-2004 à 16:08:50    

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.

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed