Thread dans une classe

Résolu
cs_goondy Messages postés 95 Date d'inscription jeudi 9 octobre 2003 Statut Membre Dernière intervention 7 janvier 2005 - 11 déc. 2004 à 12:27
cs_goondy Messages postés 95 Date d'inscription jeudi 9 octobre 2003 Statut Membre Dernière intervention 7 janvier 2005 - 11 déc. 2004 à 15:05
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

vecchio56 Messages postés 6535 Date d'inscription lundi 16 décembre 2002 Statut Membre Dernière intervention 22 août 2010 14
11 déc. 2004 à 14:34
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
3
vecchio56 Messages postés 6535 Date d'inscription lundi 16 décembre 2002 Statut Membre Dernière intervention 22 août 2010 14
11 déc. 2004 à 12:49
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");
}
0
cs_goondy Messages postés 95 Date d'inscription jeudi 9 octobre 2003 Statut Membre Dernière intervention 7 janvier 2005
11 déc. 2004 à 13:02
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!
0
vecchio56 Messages postés 6535 Date d'inscription lundi 16 décembre 2002 Statut Membre Dernière intervention 22 août 2010 14
11 déc. 2004 à 13:32
Bah non mon exemple ne plante pas, je l'ai testé
0

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

Posez votre question
Gendal67 Messages postés 627 Date d'inscription mercredi 16 juin 2004 Statut Membre Dernière intervention 24 juillet 2011 2
11 déc. 2004 à 14:06
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!! :-))
0
cs_goondy Messages postés 95 Date d'inscription jeudi 9 octobre 2003 Statut Membre Dernière intervention 7 janvier 2005
11 déc. 2004 à 14:17
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 ;)
0
cs_goondy Messages postés 95 Date d'inscription jeudi 9 octobre 2003 Statut Membre Dernière intervention 7 janvier 2005
11 déc. 2004 à 14:43
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 :/
0
cs_goondy Messages postés 95 Date d'inscription jeudi 9 octobre 2003 Statut Membre Dernière intervention 7 janvier 2005
11 déc. 2004 à 14:55
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.
0
cs_goondy Messages postés 95 Date d'inscription jeudi 9 octobre 2003 Statut Membre Dernière intervention 7 janvier 2005
11 déc. 2004 à 15:05
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 *
0
Rejoignez-nous