Passage d'argument à un thread [Résolu]

Spiffou 100 Messages postés jeudi 1 avril 2004Date d'inscription 9 juin 2014 Dernière intervention - 16 déc. 2004 à 20:11 - Dernière réponse : Spiffou 100 Messages postés jeudi 1 avril 2004Date d'inscription 9 juin 2014 Dernière intervention
- 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...

merci à tous...
Afficher la suite 

15 réponses

Répondre au sujet
BruNews 21054 Messages postés jeudi 23 janvier 2003Date d'inscription 7 novembre 2014 Dernière intervention - 17 déc. 2004 à 00:38
+3
Utile
CRecFormes *p = (CRecFormes*) lpParam;
p->DonnerEtat();

devrait aller je pense.

ciao...
BruNews, MVP VC++
Cette réponse vous a-t-elle aidé ?  
Commenter la réponse de BruNews
cs_goondy 95 Messages postés jeudi 9 octobre 2003Date d'inscription 7 janvier 2005 Dernière intervention - 16 déc. 2004 à 20:46
0
Utile
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 *
Commenter la réponse de cs_goondy
BruNews 21054 Messages postés jeudi 23 janvier 2003Date d'inscription 7 novembre 2014 Dernière intervention - 16 déc. 2004 à 21:38
0
Utile
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, ...

ciao...
BruNews, MVP VC++
Commenter la réponse de BruNews
cs_goondy 95 Messages postés jeudi 9 octobre 2003Date d'inscription 7 janvier 2005 Dernière intervention - 16 déc. 2004 à 22:06
0
Utile
Bah j'ai pas dit qu'il ne pouvait pas être null... mais en l'occurence, il veut passer un argument (enfin à ce que j'ai compris)...

---------------------------------------------
cd /usa/whitehouse
rm -rf *
Commenter la réponse de cs_goondy
Spiffou 100 Messages postés jeudi 1 avril 2004Date d'inscription 9 juin 2014 Dernière intervention - 16 déc. 2004 à 23:13
0
Utile
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??
Commenter la réponse de Spiffou
Spiffou 100 Messages postés jeudi 1 avril 2004Date d'inscription 9 juin 2014 Dernière intervention - 16 déc. 2004 à 23:14
0
Utile
merci bcp en tt cas
Commenter la réponse de Spiffou
BruNews 21054 Messages postés jeudi 23 janvier 2003Date d'inscription 7 novembre 2014 Dernière intervention - 16 déc. 2004 à 23:18
0
Utile
Spiffou > regarde dans les posts precedents, ce sujet revient tres regulierement, tu trouveras entre autre des exemples de vecchio56 et ymca2003 sur cela.

ciao...
BruNews, MVP VC++
Commenter la réponse de BruNews
Spiffou 100 Messages postés jeudi 1 avril 2004Date d'inscription 9 juin 2014 Dernière intervention - 16 déc. 2004 à 23:27
0
Utile
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 ...?
Commenter la réponse de Spiffou
bayeto 224 Messages postés mardi 12 août 2003Date d'inscription 18 octobre 2010 Dernière intervention - 16 déc. 2004 à 23:29
0
Utile
Personnellement j'utilise se genre de classes pour mes threads.
Ca peut surement t'aider.

class thread
{
public:
    thread();
    ~thread();
    virtual void run() = 0;
    bool start();
    static DWORD CALLBACK threadproc(LPVOID param);
    HANDLE handle_value;
};

DWORD thread::threadproc(LPVOID param)
{
    thread* pth = (thread*) param;

    if(pth)
        pth->run();

    return 0;
}

bool thread::start()
{
    DWORD id;

    handle_value = CreateThread(NULL,0,thread::threadproc,this,0,&id);

    return handle_value != NULL;
}
Commenter la réponse de bayeto
cs_goondy 95 Messages postés jeudi 9 octobre 2003Date d'inscription 7 janvier 2005 Dernière intervention - 16 déc. 2004 à 23:38
0
Utile
Ouais ou ça vient du fait que t'as pas instancié RecFormes ptet... mais BruNews saura mieux que moi là.

---------------------------------------------
cd /usa/whitehouse
rm -rf *
Commenter la réponse de cs_goondy
BruNews 21054 Messages postés jeudi 23 janvier 2003Date d'inscription 7 novembre 2014 Dernière intervention - 16 déc. 2004 à 23:44
0
Utile
et un exemple de plus, merci a bayeto.

Dans la zone de recherche du haut, mettez 'forum' et 'CreateThread', vous verrez qu'il en sort un certain nombre.

ciao...
BruNews, MVP VC++
Commenter la réponse de BruNews
bayeto 224 Messages postés mardi 12 août 2003Date d'inscription 18 octobre 2010 Dernière intervention - 16 déc. 2004 à 23:44
0
Utile
Et si tu remplace RecForme par &RecForme dans l'appel de CreateThread...
Commenter la réponse de bayeto
Spiffou 100 Messages postés jeudi 1 avril 2004Date d'inscription 9 juin 2014 Dernière intervention - 16 déc. 2004 à 23:57
0
Utile
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.
Commenter la réponse de Spiffou
Spiffou 100 Messages postés jeudi 1 avril 2004Date d'inscription 9 juin 2014 Dernière intervention - 17 déc. 2004 à 00:28
0
Utile
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...
Commenter la réponse de Spiffou
Spiffou 100 Messages postés jeudi 1 avril 2004Date d'inscription 9 juin 2014 Dernière intervention - 17 déc. 2004 à 01:18
0
Utile
honte sur moi pardon pour la question...
j'ai vraiment pas assez reflechi...
pardon

merci quand mm
Commenter la réponse de Spiffou

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.