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 :

Lancement d'un thread par boite de dialogue


Sujet :

MFC

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Octobre 2005
    Messages
    222
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Octobre 2005
    Messages : 222
    Points : 110
    Points
    110
    Par défaut Lancement d'un thread par boite de dialogue
    J'ai besoin dans mon programme principal d'ouvrir à un moment donné une PopUp qui reste affiché le temps de faire une opération bien précise. (Un test de connexion à un serveur, la popup restera affichée tant que la connexion n'est pas bonne).

    Pour cela, j'ai suivi votre tutoriel "Comment créer un thread de travail" (http://cpp.developpez.com/faq/vc/?pa...keWorkerThread) avec AfxBeginThread...

    Le probleme, c'est ma fonction de thread semble ne jamais se lancer...

    Mon code :
    D_TestConn.h
    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
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
     
    #pragma once
     
    #include "Controls/statictrans.h"
    #include "controls/TransparentStatic.h"
    #include "controls/GradientProgressCtrl.h"
    #include "Controls/xSkinButton.h"
    #include "controls/PictureEx.h"
     
    //Inclusion de la classe permettant de faire les tests de connexion..pour l'instant, on s'en occupe pas...
    #include "TestPing.h"
     
     
     
    #pragma managed //Car mon TestPing.h est une "ref class" 
     
    class CD_TestConn : public CDialog
    {
    public:
     
    // Dialog Data
    	enum { IDD = IDD_TESTCONN };
     
    	//Données
    	CString						Message;
     
    	//Composants
    	CPictureEx					m_picture;
    	CxSkinButton				m_picture2;
    	CTransparentStatic			m_st_l1;
    	CTransparentStatic			m_st_l2;
     
     
    	//Fonction Automatique
    	CD_TestConn(CWnd* pParent = NULL);   // standard constructor
    	virtual ~CD_TestConn();
    	virtual BOOL				OnInitDialog();
    	afx_msg void				OnCancel();
    	afx_msg void				OnPaint();
    	virtual BOOL				PreTranslateMessage(MSG* pMsg);
    	afx_msg int					OnCreate(LPCREATESTRUCT lpCreateStruct);
     
    	//Fonction Perso
    	bool InitThread();
    	afx_msg void				OnBnClickedButton1();
    	void						MajTimer(int timer);
     
    protected:
    	virtual void				DoDataExchange(CDataExchange* pDX);    // DDX/DDV support
    	DECLARE_MESSAGE_MAP()
     
    private :
    	//Mon Thread
    	static UINT	ConnectThread(LPVOID pvParam);
    	CWinThread *m_pThread;
     
    };
    #pragma unmanaged
    et mon .cpp :
    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
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    174
    175
    176
    177
    178
    179
    180
    181
    182
    183
    184
    185
    186
    187
    188
    189
    190
    191
    192
    193
    194
     
    // D_TestConn.cpp : implementation file
    //
     
    #include "stdafx.h"
    #include "Passshell.h"
    #include "D_TestConn.h"
     
     
    #pragma managed
     
    /**************
    * Constructeur
    ****************/
    CD_TestConn::CD_TestConn(CWnd* pParent /*=NULL*/)
    : CDialog(CD_TestConn::IDD, pParent)
    {
    	m_pThread = NULL;
    }
     
    /**************
    * Destructeur
    ****************/
    CD_TestConn::~CD_TestConn()
    {
    }
     
     
    /**************
    * Association des composants avec les controlleurs
    ****************/
    void CD_TestConn::DoDataExchange(CDataExchange* pDX)
    {
    	CDialog::DoDataExchange(pDX);
    	DDX_Control(pDX, IDC_LBL1,		m_st_l1);
    	DDX_Control(pDX, IDC_LBL2,		m_st_l2);
    	DDX_Control(pDX, IDC_PIC1,		m_picture);
    	DDX_Control(pDX, IDC_BUTTON1,		m_picture2);
    }
     
     
    BEGIN_MESSAGE_MAP(CD_TestConn, CDialog)
    	ON_WM_PAINT()
    	ON_BN_CLICKED(IDCANCEL, OnCancel)
    	ON_WM_CREATE()
    	ON_BN_CLICKED(IDC_BUTTON1, &CD_TestConn::OnBnClickedButton1)
    END_MESSAGE_MAP()
     
     
    /**************
    * Affichage
    ****************/
    BOOL CD_TestConn::OnInitDialog()
    {
    	CDialog::OnInitDialog();
    /**/
    .
    .
    //Ici j'instancie mes coposant d'affichages...ca marche bien...
    .
    .
    /**/
     
    	return TRUE;
    }
    /************
    * Réaffichage
    **************/
    void CD_TestConn::OnPaint()
    {
    	CPaintDC dc(this);
    	m_st_l2.SetWindowText(this->Message); //Mise à jour d'un champ texte (à partir de this->Message cf. MajTimer() ) 
    	m_st_l2.Invalidate();
    	m_st_l1.Invalidate();
    }
     
    /**************
    * Sur annulation...inutile
    ****************/
    void CD_TestConn::OnCancel() { }
     
     
    /**************
    * A la création....
    ****************/
    int CD_TestConn::OnCreate(LPCREATESTRUCT lpCreateStruct)
    {
    	if (CDialog::OnCreate(lpCreateStruct) == -1)
    		return -1;
    	return 0;
    }
     
     
    /**************
    * Lancement du thread ??? (Ca marche ca ?  C'est meme pas déclaré).
    ****************/
    bool CD_TestConn::InitThread()
    {
    	m_pThread = AfxBeginThread(ConnectThread, this,THREAD_PRIORITY_HIGHEST);
    	if(!m_pThread)
    	{
    		AfxMessageBox(_T("Impossible de créer le thread !") );
    		// Impossible de créer le thread !
    		return false;
    	}
    	return true;              
    }
     
     
    /**************
    * Mise à jour du champs texte 
    ****************/
    void CD_TestConn::MajTimer(int timer)
    {
    	char * CTimer = new char [3];
    	_itoa(timer,CTimer,10);
    	this->Message = (_T("Nouveau test dans ")+CString(CTimer))+_T(" secondes");
    	AfxMessageBox(_T("MESSAGE : ") + this->Message);
    	RedrawWindow();
    }
     
     
    /**************
    * Ca je ne sais pas à quoi ca sert...
    ****************/
    BOOL CD_TestConn::PreTranslateMessage(MSG* pMsg)
    {
    	if (pMsg->message == WM_SYSCOMMAND && pMsg->wParam == SC_CLOSE)
    		return TRUE;
    	return CDialog::PreTranslateMessage(pMsg);
    }
     
    /****************
    * Clic sur le bouton "redemmarrer"
    ******************/
    void CD_TestConn::OnBnClickedButton1()
    {
    	//On reboote la machine
    	if (!ExitWindowsEx(EWX_REBOOT|EWX_FORCE,0))
    		ExitWindowsEx(EWX_REBOOT|EWX_FORCE,0);
    	DestroyWindow(); //La fenetre se termine.
    }
     
     
    /***********************
    * Mon fameux Thread qui va tester les connection
    **************************/
    UINT CD_TestConn::ConnectThread(LPVOID pvParam)
    {
    	AfxMessageBox(_T("Je suis dans le thread..."));
    	CD_TestConn  *pThis=reinterpret_cast< CD_TestConn *>( pvParam) ;
     
    	int		nb_essai=0; 
    	int		interval=10;
    	bool	reboot=false;
    	//TestPing ^ MyPinger = gcnew TestPing();
    	while (1)
    	{
    		nb_essai++;
    		// Ici on fait le test...mais pas pour l'instant
    		/** /
                            ....
                    /**/
     
    		//Si nombre d'essai entre 1 et 3 , on attends 10 secondes entre chaque essai
    		if(nb_essai <= 5) interval =10;
    		//Si nombre d'essai entre 4 et 6 , on attends 30 secondes entre chaque essai
    		if(nb_essai > 5 && nb_essai <= 10) interval =30;
    		//Si nombre d'essai supérieur à 10  , on attends 5 minutes entre chaque essai
    		if(nb_essai >10  ) interval =300;
    		//Si nombre d'essai supérieur à 13 ... on atends que l'on redémarre la borne..
    		if(nb_essai > 13 ) reboot=true;
     
    		//Si on epuisé tout nos essais...on arrete..et on attends le reboot
    		if (reboot==true)
    		{
    			pThis->OnBnClickedButton1();
    			return 1;
    			break;
     
    		}
     
    		//Je me pose pendant l'inteval
    		for(int i=0; i< interval; i++)
    		{
    			//On affiche le temps avec le prochain essai : interval-i
    			pThis->MajTimer(interval-i);
    			Sleep(1000);
    		}
     
    	}
    	return 0;
    }
    #pragma unmanaged
    Donc, malgré les AfxMessageBox qui devraient s'afficher ou la fonction MajTImer() devrait modifier un libellé, rien ne se passe...
    La popup s'ouvre bien...mais c'est tout....

    Ou est ma bêtise ?

  2. #2
    Membre régulier
    Profil pro
    Inscrit en
    Octobre 2005
    Messages
    222
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Octobre 2005
    Messages : 222
    Points : 110
    Points
    110
    Par défaut
    PS : Dans mon programme principal, j'appelle ma PopUp avec un doModal()

  3. #3
    Membre confirmé Avatar de stephdim
    Profil pro
    Inscrit en
    Août 2007
    Messages
    462
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 462
    Points : 521
    Points
    521
    Par défaut
    Ou est lancée la fonction InitThread() ?? j'ai beau relire je ne trouve pas l'appel à cette fonction ...

    @+

  4. #4
    Membre averti
    Profil pro
    Inscrit en
    Mars 2004
    Messages
    391
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2004
    Messages : 391
    Points : 347
    Points
    347
    Par défaut
    bonjour


    j'ai pas vu dans ton code ou tu appeler ton InitThread

    cordialement

  5. #5
    Membre confirmé Avatar de stephdim
    Profil pro
    Inscrit en
    Août 2007
    Messages
    462
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 462
    Points : 521
    Points
    521
    Par défaut
    @ricky78: au moins ça me rassure, j'ai pas besoin de lunettes

  6. #6
    Membre régulier
    Profil pro
    Inscrit en
    Octobre 2005
    Messages
    222
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Octobre 2005
    Messages : 222
    Points : 110
    Points
    110
    Par défaut
    Je me doutais bien que cette fonction devait être appelée quelque part, d'où d'ailleurs mon commentaire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    /**************
    * Lancement du thread ??? (Ca marche ca ?  C'est meme pas déclaré).
    ****************/
    bool CD_TestConn::InitThread()
    ....
    Mais en relisant le tutoriel, je ne vois pas à quel moment l'on doit appeler cette fonction ? Dans mon constructeur ? Dans le OnInitDialog ?

  7. #7
    Membre confirmé Avatar de stephdim
    Profil pro
    Inscrit en
    Août 2007
    Messages
    462
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 462
    Points : 521
    Points
    521
    Par défaut
    ben ça depend a quel moment tu en as besoin ...

    si tu veux que ton thread demarre en meme temps que la boite de dialogue, je dirais de mettre l'appel dans OnInitDialog() car ton thread agit sur un controle de ta boite de dialogue, et que celui ci n'existe qu'a partir de OnInitDialog()

    @+

  8. #8
    Futur Membre du Club
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    17
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2007
    Messages : 17
    Points : 7
    Points
    7
    Par défaut
    Bonjour,
    Si tu utilise un DoModal(), alors il faut appeler ton Thread à partir de ton OnInitDialog().

  9. #9
    Membre régulier
    Profil pro
    Inscrit en
    Octobre 2005
    Messages
    222
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Octobre 2005
    Messages : 222
    Points : 110
    Points
    110
    Par défaut
    Effectivement, ca marche beaucoup mieux !! Merci

  10. #10
    Membre régulier
    Profil pro
    Inscrit en
    Octobre 2005
    Messages
    222
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Octobre 2005
    Messages : 222
    Points : 110
    Points
    110
    Par défaut
    Autre chose...il semblerait que si je détruit la fenetre, le Thread reste actif...je l'arrête comment ? (une condition dans mon While suffit ?)

  11. #11
    Membre averti
    Profil pro
    Inscrit en
    Mars 2004
    Messages
    391
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2004
    Messages : 391
    Points : 347
    Points
    347
    Par défaut
    bonjour


    afxendthread !!

    cordialement

  12. #12
    Membre confirmé Avatar de stephdim
    Profil pro
    Inscrit en
    Août 2007
    Messages
    462
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 462
    Points : 521
    Points
    521
    Par défaut
    Non, pas d'accord

    AfxEndThread() est fait pour etre appelé depuis l'interieur du thread

    Tu n'as pas a t'inquieter pour liberer les ressources du thread, les threads créés par AfxBeginThread(Proc) s'auto-détruisent dès qu'ils sont finis.

    Inutile d'ailleurs de conserver un pointeur sur le CWinThread*

    Juste comparer que AfxBeginThread()!=NULL pour tester la reussite de la fonction

    @+

  13. #13
    Futur Membre du Club
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    17
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2007
    Messages : 17
    Points : 7
    Points
    7
    Par défaut
    mais on a pas accès à AfxEndThread() une fois le Thread est lancé: si c'est un long thread et que l'on veut l'arrêter quand on veut, ça ne marche pas.
    Personellement, je fais par une scrutation d'une variable (int ArretThread par exemple) dans la class ou le thread se trouve. Puis, si je veux l'arrêter je interviens sur cette variable qui est scrutée dans mon thread. Ensuite, je fais un (return ) dès que la condition d'arrêt est donnée par ma variable.

    J'espère que ça va aider.
    A+

  14. #14
    Membre régulier
    Profil pro
    Inscrit en
    Octobre 2005
    Messages
    222
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Octobre 2005
    Messages : 222
    Points : 110
    Points
    110
    Par défaut
    Oui, c'est la condition de mon While() que je change quand je veux arrêter le thread...

Discussions similaires

  1. Sauvegarde de classeur excel par boite de dialogue excel
    Par Vincent32 dans le forum Macros et VBA Excel
    Réponses: 1
    Dernier message: 28/02/2012, 18h57
  2. choix d'un fichier par boite de dialogue pour utilisation en variable
    Par clarinnette dans le forum Macros et VBA Excel
    Réponses: 1
    Dernier message: 01/06/2010, 11h05
  3. VBA Choisir un fichier par boite de dialogue
    Par benjiprog dans le forum IHM
    Réponses: 6
    Dernier message: 08/08/2007, 16h52
  4. Réponses: 1
    Dernier message: 18/04/2007, 13h14
  5. Buotons radios avec validation par boite de dialogue
    Par alexbubs dans le forum Général JavaScript
    Réponses: 4
    Dernier message: 16/10/2005, 18h21

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