begin process at 2008 09 05 13:30:51
1 237 231 membres
186 nouveaux aujourd'hui
14 313 membres club

Vous ne trouvez pas de réponse à votre problème ? Alors posez la question dans le forum.
Souvenez-vous qu'il n'y a jamais de question bête, mais rester dans l'ignorance parce que l'on n'ose pas poser une question, ça c'est une erreur !

Sujet : Thread dans une classe [ Archives / Au secours ] (goondy)

Thread dans une classe le 11/12/2004 12:27:45

goondy
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...

Re : Thread dans une classe le 11/12/2004 12:49:23

vecchio56
(Admin CS)
this est un CFileOp* et non un CFileOp&


#include <windows.h>
#include <iostream>

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");
}

Re : Thread dans une classe le 11/12/2004 13:02:26

goondy
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!

Re : Thread dans une classe le 11/12/2004 13:32:31

vecchio56
(Admin CS)
Bah non mon exemple ne plante pas, je l'ai testé

Re : Thread dans une classe le 11/12/2004 14:06:12

Gendal67

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!

Gendal67, Dev-C++ 4.9.9.0, J'adore cppfrance!! :-))

Re : Thread dans une classe le 11/12/2004 14:17:04

goondy
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 ;)

Re : Thread dans une classe le 11/12/2004 14:34:35

vecchio56
(Admin CS)
Réponse acceptée !
Désolé je ne comprends pas ton problème, tu peux très bien appeler une fonction non statique:


#include <windows.h>
#include <iostream>

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

Re : Thread dans une classe le 11/12/2004 14:43:57

goondy
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 :/

Re : Thread dans une classe le 11/12/2004 14:55:13

goondy
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.

Re : Thread dans une classe le 11/12/2004 15:05:26

goondy
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 *


Classé sous : fonction, classe, thread, cfileop, fileop

Participer à cet échange

Pub



Appels d'offres

Recherche developpeur ...
Budget : 700€
SITE MARCHAND LOCATION...
Budget : 3 000€
SITE MARCHAND POUR HOTEL
Budget : 4 000€

CalendriCode

Septembre 2008
LMMJVSD
1234567
891011121314
15161718192021
22232425262728
2930     

Téléchargements

Logiciels à télécharger sur le même thème :

Boutique

Boutique de goodies CodeS-SourceS