IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

MFC Discussion :

[MFC] classe thread


Sujet :

MFC

  1. #1
    Membre du Club
    Inscrit en
    Juin 2004
    Messages
    111
    Détails du profil
    Informations forums :
    Inscription : Juin 2004
    Messages : 111
    Points : 53
    Points
    53
    Par défaut [MFC] classe thread
    Bonjour,
    J'aimerai faire une classe représentant un thread et heritant de CWinThread. Le problème c'est que je ne sais pas comment, dans un constructeur faire appelle à la fonction AfxBeginThread et précisant que son retour doit être le thread de ma classe.
    Thread.h
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    class Thread : public CWinThread
    {
    public:
    	HANDLE _events[2];
    	int _indice;
    	Thread(void);
    	Thread(LPVOID p_param, int p_priority, int p_indice);
    	virtual ~Thread(void);
    };
    Thread.cc
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
     
     
    Thread::Thread(void)
    {
    }
     
    Thread::~Thread(void)
    {
    }
     
    Thread::Thread(LPVOID p_param, int p_priority, int p_indice)
    {
    	_indice = p_indice;
    	_events[0] = CreateEvent(0, TRUE, FALSE, 0);
    	_events[1] = CreateEvent(0, TRUE, FALSE, 0);
    	return (Thread*)AfxBeginThread(test, p_param, p_priority);
    }
    le constructeur ne fonctionne pas... mais je ne sais pas comment faire autrement.

  2. #2
    Membre habitué
    Inscrit en
    Avril 2004
    Messages
    122
    Détails du profil
    Informations forums :
    Inscription : Avril 2004
    Messages : 122
    Points : 138
    Points
    138
    Par défaut
    Salut, tu peux montrer l'appel à AfxBeginThread ?

  3. #3
    Membre du Club
    Inscrit en
    Juin 2004
    Messages
    111
    Détails du profil
    Informations forums :
    Inscription : Juin 2004
    Messages : 111
    Points : 53
    Points
    53
    Par défaut
    Je l'ai déja montré : c'est dans le constructeur de la classe!
    Sinon, voici le code de ma boite de dlg :

    Partie de gestion des messages
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
     
    ON_MESSAGE(WM_TEST, OnReceiveMessageTest)  // message privé 
    END_MESSAGE_MAP()
     
    long CThreads_testDlg::OnReceiveMessageTest(WPARAM wparam, LPARAM lparam) 
    { 
    	int indice = (int) wparam;
    	int id = (int) lparam;
    	if(_compteur > 0)
    	{
    		_compteur-- ;
    		SetEvent(_threads[indice]->_events[0]);	
    	}
    	else
    	{
    		SetEvent(_threads[indice]->_events[1]);
    	}
    	return 0;
    }
    Le reste :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
     
    void CThreads_testDlg::execute(void)
    {
    	_compteur = 20;
    	_threads.push_back(new Thread(this, THREAD_PRIORITY_NORMAL, 0));
    	_threads.push_back(new Thread(this, THREAD_PRIORITY_NORMAL, 1));
    	for( unsigned int i=0; i<_threads.size(); i++)
    	{
    		WaitForSingleObject(_threads[i]->m_hThread, INFINITE);
    	}
    	AfxMessageBox("FIN");
    }
     
    UINT CThreads_testDlg::StartThread( LPVOID p_param )
    {
    	CThreads_testDlg* dlg = (CThreads_testDlg*)p_param;
    	dlg->execute();
    	AfxEndThread(0);
    	return 0;
     
    }
     
    void CThreads_testDlg::OnBnClickedOk()
    {
    	AfxBeginThread( StartThread, this );
    }

  4. #4
    Membre du Club
    Inscrit en
    Juin 2004
    Messages
    111
    Détails du profil
    Informations forums :
    Inscription : Juin 2004
    Messages : 111
    Points : 53
    Points
    53
    Par défaut
    En fait, je ne sais pas ou mettre la fonction associée au thread ("test") : si je la met dans le thread.h : je n'ai pas accès au dlg, si je la met dans dlg.h, je n'ai pas accès au membres de thread.h : comment faire?

  5. #5
    Membre habitué
    Inscrit en
    Avril 2004
    Messages
    122
    Détails du profil
    Informations forums :
    Inscription : Avril 2004
    Messages : 122
    Points : 138
    Points
    138
    Par défaut
    Tout d'abord, pourquoi as-tu besoin d'une classe dérivant de CWinThread ?

    De plus, si tu utilises une tel classe, tu ne dois pas l'instancier directement, tu dois faire un AfxBeginThread.

  6. #6
    Membre du Club
    Inscrit en
    Juin 2004
    Messages
    111
    Détails du profil
    Informations forums :
    Inscription : Juin 2004
    Messages : 111
    Points : 53
    Points
    53
    Par défaut
    En fait, je voulais avoir une classe qui regroupe à la fois les attributs de cWinThread et à la fois ceux dont j'ai besoin. Mais je pense que ça va tout compliquer pour pas grand chose... je vais plutôt mettre un CWinThread en membre de classe et ça ira très bien!
    Par contre, comment faire pour avoir accès au dialogue dans la classe thread? je ne peux pas inclure "dlg.h" sans que ça me fasse plein d'erreurs...

  7. #7
    Membre habitué
    Inscrit en
    Avril 2004
    Messages
    122
    Détails du profil
    Informations forums :
    Inscription : Avril 2004
    Messages : 122
    Points : 138
    Points
    138
    Par défaut
    Mettre un membre cwinthread c'est très bien, pour ta dlg, inclus le .h dans le cpp de ta classe et déclare ta dlg dans le .h.
    Passe ensuite ta dlg dans le constructeur de ta classe et ca devrai aller.

  8. #8
    Membre du Club
    Inscrit en
    Juin 2004
    Messages
    111
    Détails du profil
    Informations forums :
    Inscription : Juin 2004
    Messages : 111
    Points : 53
    Points
    53
    Par défaut
    WaitForMultipleObjects ne fonctionne pas chez moi! j'ai pris le code que tu m'avais fourni dans un autre sujet :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
     
    UINT Thread::test( LPVOID p_param )
    {
    	Thread* thr = (Thread*)p_param;
    	DWORD dwRet; 
    	while (1) 
        { 
    		dwRet = ::WaitForMultipleObjects(2, thr->_events, false, INFINITE);
     
            if (dwRet == WAIT_OBJECT_0) 
    		{ 
    			//traitement
    			ResetEvent(thr->_events[0]);
    			::PostMessage(thr->_dlg_hwnd, WM_TEST, thr->_indice, thr->_id); 
    		} 
            else if (dwRet == WAIT_OBJECT_0+1) 
            { 
    			ResetEvent(thr->_events[1]);
    			//on sort 
    			break; 
    		} 
        }
    	AfxEndThread(0);
    	return 0;
    }
    Est ce que j'ai oublié quelque chose?

    EDIT : Quand je remplace WaitForMultipleObjects par WaitForSingleObjects : ça fonctionne! mais ça n'écoute que le handle que je lui passe en paramètre...

  9. #9
    Membre habitué
    Inscrit en
    Avril 2004
    Messages
    122
    Détails du profil
    Informations forums :
    Inscription : Avril 2004
    Messages : 122
    Points : 138
    Points
    138
    Par défaut
    Essaie de passer tes events en parametre de la fonction test, pour ca tu peux passer une liste de pointeur à la fonction, ca t'evitera d'avoir acces au membre de ta classe par ton thread (ce qui n'est pas terrible en soi et peut être dangereux).

  10. #10
    Membre du Club
    Inscrit en
    Juin 2004
    Messages
    111
    Détails du profil
    Informations forums :
    Inscription : Juin 2004
    Messages : 111
    Points : 53
    Points
    53
    Par défaut
    J'ai deux classes, la classe Thread (qui contient le thread, la fonction qui lui est associé, et d'autres attributs) et la classe "CThreads_testDlg" qui est la boite de dialogue. Dans la fonction "test" (fonction associé au thread) je récupère un pointeur sur le thread et j'accède aux attribut de celui-ci : je ne vois pas ce qu'il y a de dangereux... C'est pas comme si j'accedais aux attribut de la classe CThreads_testDlg!
    Enfin, dans tout les cas, ça ne résout pas mon problème : pourquoi je n'arrive pas à faire fonctionner waitformultipleobjects???

  11. #11
    Membre habitué
    Inscrit en
    Avril 2004
    Messages
    122
    Détails du profil
    Informations forums :
    Inscription : Avril 2004
    Messages : 122
    Points : 138
    Points
    138
    Par défaut
    C'est vrai, autant pour moi, normalement ton WaitFor MultipleObjects doit fonctionner, tu lui passe les bons paramètres, mais quand tu dis qu'il ne fonctionne pas, tu veux dire que quand tu signale un evenement, il ne sort pas ?

  12. #12
    Membre du Club
    Inscrit en
    Juin 2004
    Messages
    111
    Détails du profil
    Informations forums :
    Inscription : Juin 2004
    Messages : 111
    Points : 53
    Points
    53
    Par défaut
    on dirait qu'il signale toujours un evenement "bizzare" : sa valeur de retour est dans les 3millions... normalemenent il devrait retourner 0, ou 1?
    Voila ce qui fonctionne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    dwRet = WaitForSingleObject(thr->_events[0], INFINITE);
    Et ce qui ne fonctionne pas (il retourne une valeur bidon, et donc boucle à l'infini)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    dwRet = ::WaitForMultipleObjects(2, thr->_events, false, INFINITE);

  13. #13
    Membre habitué
    Inscrit en
    Avril 2004
    Messages
    122
    Détails du profil
    Informations forums :
    Inscription : Avril 2004
    Messages : 122
    Points : 138
    Points
    138
    Par défaut
    Test si le retour n'est pas WAIT_FAILED.

    Si c'est le cas, appelle GetLestError() pour récupérer l'erreur.

  14. #14
    Membre du Club
    Inscrit en
    Juin 2004
    Messages
    111
    Détails du profil
    Informations forums :
    Inscription : Juin 2004
    Messages : 111
    Points : 53
    Points
    53
    Par défaut
    C'est à n'y rien comprendre... maintenant ça fonctionne : j'ai bien un retour de waitformultipleobject correct! 0 et 1! merci pour ton aide!

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Héritage d'une classe thread
    Par SamCB500 dans le forum MFC
    Réponses: 4
    Dernier message: 07/07/2005, 15h35
  2. [MFC] dialog & thread & progressbar
    Par Tigris94 dans le forum MFC
    Réponses: 4
    Dernier message: 05/04/2005, 15h51
  3. [MFC] Classe MFC à partir d'une TypeLib
    Par annedjomo dans le forum MFC
    Réponses: 10
    Dernier message: 15/11/2004, 11h01
  4. [MFC] UpdateData() + thread
    Par MadChris dans le forum MFC
    Réponses: 6
    Dernier message: 03/06/2004, 20h55
  5. Réponses: 4
    Dernier message: 15/01/2004, 22h53

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo