Passage d'argument à un thread

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

merci à tous...

15 réponses

BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
17 déc. 2004 à 00:38
CRecFormes *p = (CRecFormes*) lpParam;
p->DonnerEtat();

devrait aller je pense.

ciao...
BruNews, MVP VC++
3
cs_goondy Messages postés 95 Date d'inscription jeudi 9 octobre 2003 Statut Membre Derniè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 *
0
BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 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, ...

ciao...
BruNews, MVP VC++
0
cs_goondy Messages postés 95 Date d'inscription jeudi 9 octobre 2003 Statut Membre Dernière intervention 7 janvier 2005
16 déc. 2004 à 22:06
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 *
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
Spiffou Messages postés 100 Date d'inscription jeudi 1 avril 2004 Statut Membre Dernière intervention 9 juin 2014 1
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??
0
Spiffou Messages postés 100 Date d'inscription jeudi 1 avril 2004 Statut Membre Dernière intervention 9 juin 2014 1
16 déc. 2004 à 23:14
merci bcp en tt cas
0
BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 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.

ciao...
BruNews, MVP VC++
0
Spiffou Messages postés 100 Date d'inscription jeudi 1 avril 2004 Statut Membre Dernière intervention 9 juin 2014 1
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 ...?
0
bayeto Messages postés 224 Date d'inscription mardi 12 août 2003 Statut Membre Dernière intervention 18 octobre 2010
16 déc. 2004 à 23:29
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;
}
0
cs_goondy Messages postés 95 Date d'inscription jeudi 9 octobre 2003 Statut Membre Dernière intervention 7 janvier 2005
16 déc. 2004 à 23:38
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 *
0
BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
16 déc. 2004 à 23:44
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++
0
bayeto Messages postés 224 Date d'inscription mardi 12 août 2003 Statut Membre Dernière intervention 18 octobre 2010
16 déc. 2004 à 23:44
Et si tu remplace RecForme par &RecForme dans l'appel de CreateThread...
0
Spiffou Messages postés 100 Date d'inscription jeudi 1 avril 2004 Statut Membre Dernière intervention 9 juin 2014 1
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.
0
Spiffou Messages postés 100 Date d'inscription jeudi 1 avril 2004 Statut Membre Dernière intervention 9 juin 2014 1
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...
0
Spiffou Messages postés 100 Date d'inscription jeudi 1 avril 2004 Statut Membre Dernière intervention 9 juin 2014 1
17 déc. 2004 à 01:18
honte sur moi pardon pour la question...
j'ai vraiment pas assez reflechi...
pardon

merci quand mm
0
Rejoignez-nous