Passage d'argument à un thread

Résolu
Signaler
Messages postés
100
Date d'inscription
jeudi 1 avril 2004
Statut
Membre
Dernière intervention
9 juin 2014
-
Messages postés
100
Date d'inscription
jeudi 1 avril 2004
Statut
Membre
Dernière intervention
9 juin 2014
-
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...

15 réponses

Messages postés
21041
Date d'inscription
jeudi 23 janvier 2003
Statut
Modérateur
Dernière intervention
21 août 2019
30
CRecFormes *p = (CRecFormes*) lpParam;
p->DonnerEtat();

devrait aller je pense.

ciao...
BruNews, MVP VC++
Messages postés
95
Date d'inscription
jeudi 9 octobre 2003
Statut
Membre
Dernière intervention
7 janvier 2005

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 *
Messages postés
21041
Date d'inscription
jeudi 23 janvier 2003
Statut
Modérateur
Dernière intervention
21 août 2019
30
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++
Messages postés
95
Date d'inscription
jeudi 9 octobre 2003
Statut
Membre
Dernière intervention
7 janvier 2005

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 *
Messages postés
100
Date d'inscription
jeudi 1 avril 2004
Statut
Membre
Dernière intervention
9 juin 2014
1
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??
Messages postés
100
Date d'inscription
jeudi 1 avril 2004
Statut
Membre
Dernière intervention
9 juin 2014
1
merci bcp en tt cas
Messages postés
21041
Date d'inscription
jeudi 23 janvier 2003
Statut
Modérateur
Dernière intervention
21 août 2019
30
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++
Messages postés
100
Date d'inscription
jeudi 1 avril 2004
Statut
Membre
Dernière intervention
9 juin 2014
1
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 ...?
Messages postés
224
Date d'inscription
mardi 12 août 2003
Statut
Membre
Dernière intervention
18 octobre 2010

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;
}
Messages postés
95
Date d'inscription
jeudi 9 octobre 2003
Statut
Membre
Dernière intervention
7 janvier 2005

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 *
Messages postés
21041
Date d'inscription
jeudi 23 janvier 2003
Statut
Modérateur
Dernière intervention
21 août 2019
30
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++
Messages postés
224
Date d'inscription
mardi 12 août 2003
Statut
Membre
Dernière intervention
18 octobre 2010

Et si tu remplace RecForme par &RecForme dans l'appel de CreateThread...
Messages postés
100
Date d'inscription
jeudi 1 avril 2004
Statut
Membre
Dernière intervention
9 juin 2014
1
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.
Messages postés
100
Date d'inscription
jeudi 1 avril 2004
Statut
Membre
Dernière intervention
9 juin 2014
1
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...
Messages postés
100
Date d'inscription
jeudi 1 avril 2004
Statut
Membre
Dernière intervention
9 juin 2014
1
honte sur moi pardon pour la question...
j'ai vraiment pas assez reflechi...
pardon

merci quand mm