Thread dans une classe [Résolu]

Signaler
Messages postés
95
Date d'inscription
jeudi 9 octobre 2003
Statut
Membre
Dernière intervention
7 janvier 2005
-
cs_goondy
Messages postés
95
Date d'inscription
jeudi 9 octobre 2003
Statut
Membre
Dernière intervention
7 janvier 2005
-
Désolé de poser cette question, mais tous les exemples que j'ai pu trouver (et il y en a un paquet) traite d'un thread dans une appli avec une seule classe (la principale quoi)... et sans appel sur une autre fonction.
D'ou mon problème!
J'ai une classe nommée "CFileOp".

----> dans le "FileOp.h", je déclare ma fonction Thread, et une autre fonction, tout ça en "private" :

-----------------------------------------------------------------
static DWORD WINAPI ThreadProc(LPVOID lpParam);
void CopyOperation();
-----------------------------------------------------------------

----> dans le "FileOp.cpp", je définis ma fonction :

-----------------------------------------------------------------
DWORD WINAPI CFileOp::ThreadProc(LPVOID lpParam)
{
CFileOp &fileop = (CFileOp&)lpParam;

fileop.CopyOperation();

return 0;
}
-----------------------------------------------------------------

-----> et je lance mon Thread dans une fonction en faisant :

-----------------------------------------------------------------
DWORD ThreadId;
CreateThread(NULL,NULL,ThreadProc,(LPVOID)this,NULL,&ThreadId);
-----------------------------------------------------------------

Comme ça, ça compile, mais ça plante, et ca ne m'étonne pas trop... vraisemblablement un mic mac dans la mémoire avec le passage de "(LPVOID)this" en paramètre.
Mais si je ne le mets pas et que je lance juste "CopyOperation();", il m'envoie ballader parce que "CopyOperation()" n'est pas static... mais je ne peux pas la déclarer static, parce qu'elle ne l'est pas...

Pitié, sortez moi de ce cauchemard... je suis sûr que c'est une brouitille...

9 réponses

Messages postés
6535
Date d'inscription
lundi 16 décembre 2002
Statut
Modérateur
Dernière intervention
22 août 2010
7
Désolé je ne comprends pas ton problème, tu peux très bien appeler une fonction non statique:

#include <windows.h>
#include 

using namespace std;

class CFileOp
{
int i;
public:
CFileOp();
void f();
static DWORD WINAPI ThreadProc(LPVOID lpParam);
void CopyOperation();
};

CFileOp::CFileOp()
{
i = 56;
DWORD ThreadId;
CreateThread(NULL,NULL,ThreadProc,(LPVOID)this,NULL,&ThreadId);
}

DWORD WINAPI CFileOp::ThreadProc(LPVOID lpParam)
{
CFileOp* fileop = (CFileOp*)lpParam;
fileop->f();
return 0;
}

void CFileOp::f()
{
cout << i;
}

int main()
{
CFileOp* f = new CFileOp();
system("pause");
}


"il n'y a pas de main dans cette classe"
Qu'est ce que tu entends pas la? C'est sur que le main n'est jamais dans une classe, il doit être dans l'espace de noms global
Messages postés
6535
Date d'inscription
lundi 16 décembre 2002
Statut
Modérateur
Dernière intervention
22 août 2010
7
this est un CFileOp* et non un CFileOp&

#include <windows.h>
#include 

using namespace std;

class CFileOp
{
int i;
public:
CFileOp();
static DWORD WINAPI ThreadProc(LPVOID lpParam);
void CopyOperation();
};

CFileOp::CFileOp()
{
i = 56;
DWORD ThreadId;
CreateThread(NULL,NULL,ThreadProc,(LPVOID)this,NULL,&ThreadId);
}

DWORD WINAPI CFileOp::ThreadProc(LPVOID lpParam)
{
CFileOp* fileop = (CFileOp*)lpParam;
cout << "i = " << (int)fileop->i;
return 0;
}

int main()
{
CFileOp* f = new CFileOp();
system("pause");
}
Messages postés
95
Date d'inscription
jeudi 9 octobre 2003
Statut
Membre
Dernière intervention
7 janvier 2005

Merci pour ta réponse, mais le résultat est exactement le même, ça compile mais ça plante tout autant.

Y a une grosse piste là http://www.developpez.net/forums/viewtopic.php?p=932783, mais j'avoue que j'y capte pas des masses... j'ai fait du thread en java et sous nux (c'est pas récent ça lol) ... mais là, j'ai du mal boudiou!
Messages postés
6535
Date d'inscription
lundi 16 décembre 2002
Statut
Modérateur
Dernière intervention
22 août 2010
7
Bah non mon exemple ne plante pas, je l'ai testé
Messages postés
627
Date d'inscription
mercredi 16 juin 2004
Statut
Membre
Dernière intervention
24 juillet 2011

Moi, grace a vecchio dans un autre topic, j'ai réussi a faire exactement la même choz mais moi mon pb, c ke tt compile sans pb mais que la fct n'est pas lancée ac le CreateThread() ! allez comprendre pk! mdr! :big)

Gendal67, Dev-C++ 4.9.9.0, J'adore cppfrance!! :-))
Messages postés
95
Date d'inscription
jeudi 9 octobre 2003
Statut
Membre
Dernière intervention
7 janvier 2005

Possible vecchio56 (morbihan toi aussi????), mais dans ton exemple, tu as changé un détail : tu fais "(int)fileop->i" et tu appelles une variable membre de la classe.
Moi ce que j'ai dit que j'appelais, c'est pas une variable, mais une méthode (non statique) de la classe... et ça il n'aime pas du tout!!!!

De plus, il n'y a pas de main dans cette classe, car le thread n'est pas lancé dans la classe principale de mon application.
Ce n'est pas le même contexte...

Si tu mattes le lien au dessus, le mec a réussi à se débarasser du static... si tu comprends, je veux bien une 'tite explication ;)
Messages postés
95
Date d'inscription
jeudi 9 octobre 2003
Statut
Membre
Dernière intervention
7 janvier 2005

Je n'utilise pas de namespace...

Je t'explique : la méthode "CopyOperation()" me permet de copier tout un tas de trucs, avec une progress bar... mais la copie bouffe toute les ressources et la merdoie pour raffraichir l'affichage.

J'ai eu la même histoire en java et j'ai claqué un thread (dieu que c'est simple dans ce langage) et c niquel.

Là, si je lance le CopyOperation(), ça marche... mais l'affichage n'est pas rafraichis si tu mets une autre fenetre devant ou si tu veux bouger la fenetre.

Mais si je fais :

DWORD WINAPI CFileOp::ThreadProc(LPVOID lpParam)
{
CFileOp* fileop = (CFileOp*)lpParam;
fileop->CopyOperation();
return 0;
}


Bah je t'assure que ca plante!

Et je suis carrément paumé...

Merci de t'occuper de mon cas... et désolé de passer pour un boulet :/
Messages postés
95
Date d'inscription
jeudi 9 octobre 2003
Statut
Membre
Dernière intervention
7 janvier 2005

Atta, j'ai mis le doigt dessus... en fait le thread semble bon, mais je fais un "UpdateData(FALSE);", et j'ai vu en pas à pas que c'est là que ça plante... ça me gave mais bon, je vais essayer de le lancer juste avant le thread.
Messages postés
95
Date d'inscription
jeudi 9 octobre 2003
Statut
Membre
Dernière intervention
7 janvier 2005

Ouais bah c'est ça le problème... je ne sais pas encore comment rafraichir mon affichage, puisque je ne peux pas le faire dans le thread... mais ta réponse était bonne vecchio56, merci bcp.

cd /usa/whitehouse
rm -rf *