Spiffou
Messages postés100Date d'inscriptionjeudi 1 avril 2004StatutMembreDernière intervention 9 juin 2014
-
16 déc. 2004 à 20:11
Spiffou
Messages postés100Date d'inscriptionjeudi 1 avril 2004StatutMembreDernière intervention 9 juin 2014
-
17 déc. 2004 à 01:18
salut à tous,
j'ai besoin d'utiliser des threads pour effectuer un traitement en parallele, le pb c'est que ce traitement est une methode mais que je n'arrive pas a l'appeler depuis le thread. je m'explique:
Classe1:
methode x
Classe2:
methode y
et dans la methodex de la classe 1 j'instancie la classe 2 puis je lance le thread qui doit effectuer le traitement correspondant à la methode y. il parait qu'au lancement du thread il faut lui passer un pointeur sur l'instance de la classe qu'il doit manipuler. voila ce que j'ai fait:
// declaration
// prototye de la procédure utilisée pour notre 2e thread
DWORD WINAPI ThreadRDF(LPVOID lpParam, CRecFormes &RecFormes);
puis dans la methode x:
// constructeur de la classe 2
CRecFormes RecFormes;
// lancement du thread de gestion de la webcam
DWORD ThreadRDFId;
// On démarre le thread. ThreadId est l'identifiant du thread
// ThreadId ne nous est d'aucune utilité dans cet exmple car le thread se termine de lui même
CreateThread(NULL,NULL,ThreadRDF,NULL,NULL,&ThreadRDFId);
enfin dans le code du thread, je mets:
RecFormes.methode y
qqun sait il comment bien passer un pointeur de classe ou comment faire dans mon cas si j suis parti sur la mauvaise voie...
cs_goondy
Messages postés95Date d'inscriptionjeudi 9 octobre 2003StatutMembreDernière intervention 7 janvier 2005 16 déc. 2004 à 20:46
Perdu, tu ne peux pas passer de paramètres à un thread autre que le seul et unique "LPVOID lpParam".
Ton quatrième paramètre dans "CreateThread(NULL,NULL,ThreadRDF,NULL,NULL,&ThreadRDFId)" , ne mets pas "null" mais le paramètre que tu veux passer à ta fonction de thread.
ensuite, dans ton "ThreadRDF(LPVOID lpParam)", tu fais un cast de "lpParam" et tu peux récupérer ton paramètre comme ça. Voilà! ;)
---------------------------------------------
cd /usa/whitehouse
rm -rf *
BruNews
Messages postés21040Date d'inscriptionjeudi 23 janvier 2003StatutModérateurDernière intervention21 août 2019 16 déc. 2004 à 21:38
Le param de thread peut tout a fait etre ZERO (NULL), aucune necessite d'avoir un param a traiter. Le systeme ne fait que nous le repasser dans la func de thread, aucun probleme.
Si tu dois pouvoir acceder a ta classe alors tu lui passeras:
..., (void*) this, ...
Spiffou
Messages postés100Date d'inscriptionjeudi 1 avril 2004StatutMembreDernière intervention 9 juin 20141 16 déc. 2004 à 23:13
exactement, je voulais un arg...
par ctre, cf la reponse de brunews:
si on veut juste recuperer des objet (methode ou var) de la classe ayant crée le thread (dans l'une de ses methodes), on peut le rappeler en faisant this??
BruNews
Messages postés21040Date d'inscriptionjeudi 23 janvier 2003StatutModérateurDernière intervention21 août 2019 16 déc. 2004 à 23:18
Spiffou > regarde dans les posts precedents, ce sujet revient tres regulierement, tu trouveras entre autre des exemples de vecchio56 et ymca2003 sur cela.
Spiffou
Messages postés100Date d'inscriptionjeudi 1 avril 2004StatutMembreDernière intervention 9 juin 20141 16 déc. 2004 à 23:27
voila j'ai essayé de suivre vos conseils:
CRecFormes RecFormes;
// prototye de la procédure utilisée pour notre 2e thread
DWORD WINAPI ThreadRDF(LPVOID lpParam);
// lancement du thread de gestion de la webcam
DWORD ThreadRDFId;
// On démarre le thread. ThreadId est l'identifiant du thread
// ThreadId ne nous est d'aucune utilité dans cet exmple car le thread se termine de lui même
CreateThread(NULL,NULL,ThreadRDF,(void*) RecFormes,NULL,&ThreadRDFId);
mais il refuse de compiler j'ai aussi essayé sans caster RecFormes
j pense que c'est du au fait que RecFormes est une classe et pas une simple var (puisque ca marche si j passe un int...) du coup comment faut il faire ...?
Spiffou
Messages postés100Date d'inscriptionjeudi 1 avril 2004StatutMembreDernière intervention 9 juin 20141 16 déc. 2004 à 23:57
pour le &recformes j'ai deja fait et ca pose le mm pb...
par contre brunews j'ai deja cherché, surement pas assez bien, j'ai un peu l'impression de tomber tjs sur comment creer un thread ou alors comment on peut synchro avec thread ou mutex...
mais bon j vais recommencer avec un peu plus de perseverance... en effet rien de pire que les clones de sujet sur un forum.
Spiffou
Messages postés100Date d'inscriptionjeudi 1 avril 2004StatutMembreDernière intervention 9 juin 20141 17 déc. 2004 à 00:28
ben je suis désolé, mais :
// instanciation d'une classe
CRecFormes RecFormes;
// creation du thread
CreateThread(NULL,NULL,ThreadRDF,(DWORD *)&RecFormes,NULL,&ThreadRDFId);
le pb venait du fait que je n'avais pas mis le & en castant en dword du coup c t pas un pointeur sur 32b --> po content
donc là ca passe, par contre la question du cou apres ^^
c comment qu'on fait pour caster une classe???
// Procédure utilisée par le thread
DWORD WINAPI ThreadRDF(LPVOID lpParam)
{
while (1)
{
(CRecFormes) RecFormes.DonnerEtat();
}
return 0;
}
voila ce que j'ai fait mais bon bien sur ca ne marche pas...
error C2226: syntax error : unexpected type 'RecFormes'
ps :
apres 3 pages de recherches, j'ai bien vu mon erreur, mais j crois etre le seul pour l'instant a avoir demander à passer un pointeur de classe pour le moment (ca attenue un peu mes tords brunews?? ^^)
dsl pour le debut du topic pour lequel la reponse se trouvait deja sur le forum...