begin process at 2012 05 30 13:45:01
  Trouver un code source :
 
dans
 
Accueil > Forum > 

Archive C/C++

 > 

Archives

 > 

Au secours

 > 

Thread dans une classe


Derniers messages déposésPoser une question dans le forum ou lancer une discussion

Thread dans une classe

samedi 11 décembre 2004 à 12:27:45 | Thread dans une classe

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...
samedi 11 décembre 2004 à 12:49:23 | Re : Thread dans une classe

vecchio56

Administrateur CodeS-SourceS
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");
}
samedi 11 décembre 2004 à 13:02:26 | Re : Thread dans une classe

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!
samedi 11 décembre 2004 à 13:32:31 | Re : Thread dans une classe

vecchio56

Administrateur CodeS-SourceS
Bah non mon exemple ne plante pas, je l'ai testé
samedi 11 décembre 2004 à 14:06:12 | Re : Thread dans une classe

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!! :-))
samedi 11 décembre 2004 à 14:17:04 | Re : Thread dans une classe

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 ;)
samedi 11 décembre 2004 à 14:34:35 | Re : Thread dans une classe

vecchio56

Administrateur CodeS-SourceS
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
samedi 11 décembre 2004 à 14:43:57 | Re : Thread dans une classe

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 :/
samedi 11 décembre 2004 à 14:55:13 | Re : Thread dans une classe

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.
samedi 11 décembre 2004 à 15:05:26 | Re : Thread dans une classe

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 *


Cette discussion est classée dans : fonction, classe, thread, cfileop, fileop


Répondre à ce message

Sujets en rapport avec ce message

fonction recevant un pointeur de fonction d'une classe [ par fuliculi ] Bonjour à tous,j'ai un thread qui doit faire évoluer une variable "progress" de 0 à 100% (j'utilise les mutex pour éviter les écritures/lectures simul Synchronisation!!! [ par PunkDude424 ] J'ai un problème avec la synchronisation de ThreadVoilà, je fais un "ScreenSaver" qui affiche des point a des temps radom et dune durée random aussi.. dois-je utiliser un thread ? [ par the diouk ] dans le prog que je fais, j'appelle une fonction de comptage qui peut durée plusieurs heures, elle est lancée quand j'appuye sur run dans le menu. mai Fonction membre dans un thread [ par Galmiza ] Bonjour, J'essaie de créer un thread et d'y lancer une fonction 'ClientSend' membre d'une classe avec: m_SendThread = CreateThread(NULL, 0, &ClientSe Fonction Scrabble [ par bowen_tk ] Bonjour  Je suis entrain de programmer un scrabble en C++ mais je rencontre actuellement un probleme :  Mon programme possede une classe Cmot et une c une classe static [ par Adeon ] bonjour a tous!je suis sur le developpement d'un jeux.certaine classe ne contienne qu'un seul objet comme par exemple la classe Interface, ou encore l [MFC] appel de la classe CFormview [ par sliders75 ] Bonjour, J'ai un projet MFC avec une classe CFormulaire de type CFormview (Formulaire.cpp), et dans cette classe, j'ai une fonction void Ajouter() Cet Probleme avec les threads en C++ sour linux [ par benjamvs ] Bonjour,j'ai le probleme suivant a regler en C++je travaille sur les threads sous linux, avec la librairie "pthread"Lorsque je crée un thread, celui c Problème utilisation fonction [ par sidhannowe ] Bonjour, J'utilise la classe screenshot présentée ici: http://www.cppfrance.com/code.aspx?id=21255 mais lorsque je compile Dev c++ m'indique des erre wxglcanvas ---> aidez-moi ! [ par satellite34 ] salut, enfin je pourrai dire rerereresalut;bon j'ai vraiment un gros soucis quant a l'utilisation de la classe wxGLCanvas;voila, j'ai fait une fonctio


Nos sponsors


Sondage...

CalendriCode

Mai 2012
LMMJVSD
 123456
78910111213
14151617181920
21222324252627
28293031   

Consulter la suite du CalendriCode

Photothèque

A découvrir



 
Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils.
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 0,749 sec (3)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales