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

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

  7. #7
    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
    J'ai compris que ma syntaxe est fausse... Mais qu'est ce qu'il fait dans mon code ?

    Il stoppe le 1er Thread jusqu'à la fin du 2ème Thread ?
    C'est par curiositer, pas pour résoudre mon pb.

  8. #8
    Membre très actif
    Profil pro
    Développeur indépendant
    Inscrit en
    Août 2004
    Messages
    374
    Détails du profil
    Informations personnelles :
    Âge : 56
    Localisation : France

    Informations professionnelles :
    Activité : Développeur indépendant
    Secteur : Transports

    Informations forums :
    Inscription : Août 2004
    Messages : 374
    Par défaut appels en boucles.
    bon, ben aprés un rapide tour de ton code qui bloque.. et pour ton elevation personnelle, je puis te dire ceci.

    pourquoi utilises tu THREAD_PRIORITY_TIME_CRITICAL ???
    c'est peut -être déja la principale source de ton probleme...
    imagine, tu crée un thread pratiquement de même priorité que le noyau windows..... ca s'appelle pas de la gourmandise ca.???

    donc, c'est peut etre un peu normal que ca bloque..
    et puis je trouve assez contradictoire d'attendre , dans un processus de priorité critique, 5000 millisecondes.

  9. #9
    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
    Même en changant la priorité, le résultat est le même.
    En fait, le problème vient du fait que la fonction appelée est dans la même classe.
    Si je la sors, ça fonctionne. C'est donc sur ce point que je cherche une réponse

+ 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