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 :

AfxBeginThread dans une classe


Sujet :

MFC

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Septembre 2005
    Messages
    200
    Détails du profil
    Informations personnelles :
    Localisation : France, Bas Rhin (Alsace)

    Informations forums :
    Inscription : Septembre 2005
    Messages : 200
    Par défaut AfxBeginThread dans une classe
    Bonjour,

    Quelle est la raison qui oblige une fonction de thread à être une fonction statique ?

    Si je crée 3 objets issus d'une classe, il n'est pas possible d'avoir 3 Threads différents ?

    A part ça, en utilisant la méthode AfxBeginThread() dans une classe, lors de l'exécution de cette fonction, la fonction "mère" n'évolue plus. Seule la fonction lancée par le Thread "fils" est exécuté.

    Merci d'avance

    Nicolas
    Strasbourg

  2. #2
    Rédacteur
    Avatar de farscape
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2003
    Messages
    9 055
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2003
    Messages : 9 055
    Par défaut
    salut,
    je vois au moins une raison principal à ça:
    si l'objet dont la méthode liée au thread venait a être détruit bonjour les dégâts..
    la deuxième est certainement lié à la signature de la fonction ,et le fait que ça fonctionne pour des fonctions écrites en C...

    mais la fonction statique ne cause aucun problème ,il est coutume de passer en argument du thread l'adresse de l'instance de l'objet initiateur du thread.
    voir faq:
    http://c.developpez.com/faq/vc/?page...keWorkerThread

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Septembre 2005
    Messages
    200
    Détails du profil
    Informations personnelles :
    Localisation : France, Bas Rhin (Alsace)

    Informations forums :
    Inscription : Septembre 2005
    Messages : 200
    Par défaut
    Donc je dois forcément sortir la fonction Thread de ma classe. Merci pour cette réponse rapide.

    Voici ce que j'avais écrit (pas de fonction statique, tout dans la même classe) : tout se passe bien, sauf que l'on ne sorte jamais de AfxBeginThread(). (Le thread "fils" est exécucté, et le thread "père" est bloqué).

    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
    UINT ClsClasse::interruptThread(LPVOID context)
    {   
    	BOOL end = FALSE;
     
    	while (!end)
    	{
    		// attente d'un des 3 évènements :
    		ret = WaitForMultipleObjects(2, td->InterruptEvents, FALSE, 5000);
     
    		// Traitement prériodique + événementiel
    	}
    	return 0;
    }
     
    int ClsClasse::InitInterruptHandling()
    {
    	this->m_intThread = AfxBeginThread((CRuntimeClass*)this->interruptThread( (void*) &this->m_threadData), THREAD_PRIORITY_TIME_CRITICAL,0,0,0)) ;
    	return 0;
    }
    Y a t il une explication à ce comportement ?

  4. #4
    Rédacteur
    Avatar de farscape
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2003
    Messages
    9 055
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2003
    Messages : 9 055
    Par défaut
    Citation Envoyé par Nico_stras
    Donc je dois forcément sortir la fonction Thread de ma classe. Merci pour cette réponse rapide.

    Voici ce que j'avais écrit (pas de fonction statique, tout dans la même classe) : tout se passe bien, sauf que l'on ne sorte jamais de AfxBeginThread(). (Le thread "fils" est exécucté, et le thread "père" est bloqué).

    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
    UINT ClsClasse::interruptThread(LPVOID context)
    {   
        BOOL end = FALSE;
     
        while (!end)
        {
            // attente d'un des 3 évènements :
            ret = WaitForMultipleObjects(2, td->InterruptEvents, FALSE, 5000);
     
            // Traitement prériodique + événementiel
        }
        return 0;
    }
     
    int ClsClasse::InitInterruptHandling()
    {
        this->m_intThread = AfxBeginThread((CRuntimeClass*)this->interruptThread( (void*) &this->m_threadData), THREAD_PRIORITY_TIME_CRITICAL,0,0,0)) ;
        return 0;
    }
    Y a t il une explication à ce comportement ?
    ben non ,tu as lu le post de la faq avec les exemples ? .

  5. #5
    Membre confirmé
    Profil pro
    Inscrit en
    Septembre 2005
    Messages
    200
    Détails du profil
    Informations personnelles :
    Localisation : France, Bas Rhin (Alsace)

    Informations forums :
    Inscription : Septembre 2005
    Messages : 200
    Par défaut
    Citation Envoyé par farscape
    ben non ,tu as lu le post de la faq avec les exemples ? .
    Pas compris ce que tu veux dire.

    Ben non, je sais pas ce qui va pas ?
    ben non, c'est normal que la marche pas ?

    j'ai compris que c'est pas bon (tout dans même classe), mais pourquoi ?

    Je suis peut-être un peu lourd, mais j'aime bien comprendre le pourquoi

    Merci

  6. #6
    Rédacteur
    Avatar de farscape
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2003
    Messages
    9 055
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2003
    Messages : 9 055
    Par défaut
    hé bien regarde un des codes d'exemples posté dans la faq:
    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
    27
    28
    29
    30
    31
    32
    33
    34
     
    class CMyDialog : public CDialog
    {
    public:
        CMyDialog(CWnd* pParent = NULL)
            : CDialog(CMyDialog::IDD, pParent)
        {
            m_pThread = NULL;
        }
     
        bool InitThread()
        {
            m_pThread = AfxBeginThread(ThreadFunc, this);
            if(!m_pThread)
            {
                // Impossible de créer le thread !
                return false;
            }
            return true;              
        }
     
    private:
        CWinThread *m_pThread;            
     
        static UINT ThreadFunc(LPVOID pvParam);
    };
     
    UINT CMyDialog::ThreadFunc(LPVOID pvParam)
    {
        CMyDialog  *pThis=reinterpret_cast< CMyDialog *>( pvParam) ;
        // Votre code
        //
        return 0 ;
    }
    et regarde ce que tu as ecris pour AfxBeginThread
    sur le passage de la fonction en argument...

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

Discussions similaires

  1. Réponses: 8
    Dernier message: 09/07/2005, 23h10
  2. classe dans une classe ?
    Par tut dans le forum UML
    Réponses: 23
    Dernier message: 25/06/2004, 15h00
  3. [Thread] Erreur dans une classe interne
    Par totof2308 dans le forum Général Java
    Réponses: 5
    Dernier message: 03/06/2004, 08h15
  4. Thread dans une classe ?
    Par Sephi dans le forum Threads & Processus
    Réponses: 7
    Dernier message: 07/03/2004, 18h16
  5. Fonction callback dans une classe
    Par julian_ross dans le forum MFC
    Réponses: 8
    Dernier message: 02/03/2004, 11h42

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