probleme avec le mot clé static et les threads sous windows [c++] - C++ - Programmation
Marsh Posté le 23-02-2004 à 11:31:13
mmh ... tu aurais pu poster ds le mm topic hein
ca ca veut dire que tu as des fonctions membres déclarées mais pas définies.
Marsh Posté le 23-02-2004 à 11:49:02
blackgoddess a écrit : mmh ... tu aurais pu poster ds le mm topic hein |
oui c'est vrai, désolé
sinon pour en revenir au probleme, j'ai ma méthode définie comme suit :
Code :
|
et déclarée comme ça :
Code :
|
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).
Marsh Posté le 23-02-2004 à 11:55:55
beusser a écrit :
|
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.
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 ...
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 .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.
Marsh Posté le 23-02-2004 à 12:35:09
raaah
comme je disais, tu déclare pas des machins en static
Code :
|
pour reprendre hein
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.
Marsh Posté le 23-02-2004 à 13:16:40
blackgoddess a écrit : raaah
|
ok merci, j'ai compris ! je vais essayer
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)
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();
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 |
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)
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
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"
Marsh Posté le 24-02-2004 à 19:31:39
mmh ... bin ta un pb dans ton code, un access violation surement => utilisation d'un pointeur pointant ds le vent.
Marsh Posté le 26-02-2004 à 16:08:50
BlackGoddess a écrit : mmh ... bin ta un pb dans ton code, un access violation surement => utilisation d'un pointeur pointant ds le vent. |
ok g trouvé, c t pasque javé pas fé nomClasse::nomVariableStatic
merci quand même.
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