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 :

Arr�t de thread


Sujet :

MFC

  1. #1
    Membre confirm�
    Inscrit en
    Janvier 2006
    Messages
    152
    D�tails du profil
    Informations forums :
    Inscription : Janvier 2006
    Messages : 152
    Par d�faut Arr�t de thread
    Bonjour,

    apr�s quelques heures de lecture de la FAQ et des multiples sujets lanc�s sur l'arret des thread j'ai compris qu'il fallait utiliser un WaitForSingleObject pour terminer son thread � partir d'une fonction externe (� ce propos il y a une petite erreur de nommage des handles dans la FAQ du cot� des
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    HANDLE m_hEndThread;
    HANDLE m_hWaitThread;.
    avec un h de trop)


    Je cr�� donc mon thread comme pr�vu dans la FAQ auquel je rajoute mon WaitForSingleObject (non bloquant si j'ai bien suivi)


    Cr�ation du thread
    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
    bool MainDialog::InitThread()
    {
    	m_pThread = AfxBeginThread(ThreadFunc, this);
    	if(!m_pThread)
    	{
    		// Impossible de créer le thread !
    		return false;
    	}
    	return true;              
    }
     
     
    //
    //
    //
    UINT MainDialog::ThreadFunc(LPVOID pvParam)
    {
        MainDialog  *pThis=reinterpret_cast< MainDialog *>( pvParam) ;
     
    	// Votre code
     
    	while (1){
    		::PostMessage(*pThis,WM_TEST,0,0);
    		if(::WaitForSingleObject(pThis->m_hEndThread, 0) == WAIT_OBJECT_0)	
    		{
    			// signale l'objet event d'attente et sort.
    			::SetEvent(pThis->m_hWaitThread);
    			return 0;
    		} 
    		Sleep(1000);
    	}
     
        return 0 ;
    }
    dans mon thread j'invoque un message priv� :ostMessage qui lance une fonction qui �crit "coucou" dans une editbox.

    maintenant je souhaite d�marrer mon Thread � partir d'un bouton et l'arr�ter � partir d'un autre, pour cela je fais:

    Bouton de d�marrage de Thread
    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
    void MainDialog::OnClickBtnCallDecrac() 
    {
    	// TODO: Add your control notification handler code here
    	CString tempText;
    	CString cBtnName = "Thread Demarré";
    	GetDlgItem(FLD_DEBUGEDIT)->GetWindowText(tempText);
    	if (tempText == ""){
    		GetDlgItem(FLD_DEBUGEDIT)->SetWindowText(cBtnName);
    	}
    	else {
    		GetDlgItem(FLD_DEBUGEDIT)->SetWindowText(cBtnName + "\r\n" + tempText);
    	}
    	//PostMessage(WM_TEST);
    	InitThread();
    }
    Bouton d'arret du thread

    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
    void MainDialog::OnCallHld() 
    {
    	// TODO: Add your control notification handler code here
    	CString tempText;
    	CString cBtnName = "Thread Arrete";
    	GetDlgItem(FLD_DEBUGEDIT)->GetWindowText(tempText);
    	if (tempText == ""){
    		GetDlgItem(FLD_DEBUGEDIT)->SetWindowText(cBtnName);
    	}
    	else {
    		GetDlgItem(FLD_DEBUGEDIT)->SetWindowText(cBtnName + "\r\n" + tempText);
    	}
    	::SetEvent(m_hEndThread);
     
    	// attend que le thread soit terminé
    	::WaitForSingleObject(m_hWaitThread, INFINITE);
     
    	// fermeture dans handles
    	::CloseHandle(m_hEndThread);
    	::CloseHandle(m_hWaitThread);
    }
    avec ceci, apr�s avoir cliqu� sur le bouton d'arret, mon thread continue de tourner et de m'afficher "coucou" dans mon editbox.
    Quelqu'un verrait-il mon erreur ?

    Merci d'avance

  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 ne vois pas la creation des events dans ton code .

  3. #3
    Membre confirm�
    Inscrit en
    Janvier 2006
    Messages
    152
    D�tails du profil
    Informations forums :
    Inscription : Janvier 2006
    Messages : 152
    Par d�faut
    j'ai cr�� mes events dans le constructeur de la fenetre de dialogue

    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    MainDialog::MainDialog(CWnd* pParent /*=NULL*/)
    	: CDialog(MainDialog::IDD, pParent)
    {
    	//{{AFX_DATA_INIT(MainDialog)
    		// NOTE: the ClassWizard will add member initialization here
    	//}}AFX_DATA_INIT
    	m_pThread = NULL;
    	HANDLE m_hEndThread = CreateEvent(0, TRUE, FALSE, 0);
    	HANDLE m_hWaitThread = CreateEvent(0, TRUE, FALSE, 0);
    }
    pareil que dans la FAQ je crois :/

  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
    le code de la faq a quelques erreurs le code suivant que je viens de tester
    avec vc2005 fonctionne:
    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
     
    class CWorkerThread
    {
    public:
      CWorkerThread();
      ~CWorkerThread();
     
    private:
      HANDLE m_hEndThread;
      HANDLE m_hWaitThread;
     
      static UINT ThreadFunction(LPVOID* pvParam);
    };
     
    CWorkerThread::CWorkerThread()
    {
      // Creation des  events
      m_hEndThread = CreateEvent(0, TRUE, FALSE, 0);
      m_hWaitThread = CreateEvent(0, TRUE, FALSE, 0);
     
      // depart du thread
      AfxBeginThread((AFX_THREADPROC )ThreadFunction, this);
    }
     
    CWorkerThread::~CWorkerThread()
    {
      // declenche la fin du thread
      ::SetEvent(m_hEndThread);
     
      // attend que le thread soit terminé
      ::WaitForSingleObject(m_hWaitThread, INFINITE);
     
      // fermeture dans handles
      ::CloseHandle(m_hEndThread);
      ::CloseHandle(m_hWaitThread);
    }
     
    UINT CWorkerThread::ThreadFunction(LPVOID* pvParam)
    {
      CWorkerThread *pThis = reinterpret_cast<CWorkerThread *>(pvParam);
     
      while(true)
      {
        // attente evenement de fin du thread. -> l’objet doit être ‘signalé ‘
       // WaitForSingleObject  renvoie WAIT_OBJECT_0 si l’objet est signalé.
        if(::WaitForSingleObject(pThis->m_hEndThread, 0) == WAIT_OBJECT_0)
     
        {
          // signale l'objet event d'attente et sort.
          ::SetEvent(pThis->m_hWaitThread);
          return 0;
        }
    	_sleep(5000);
        // Votre code de traitement.
      }
      return 0;
    }

  5. #5
    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
    pareil avec la meme erreur de ne pas avoir mis en /*HANDLE */ sur les events...
    promis je vais corriger ce post

  6. #6
    Membre confirm�
    Inscrit en
    Janvier 2006
    Messages
    152
    D�tails du profil
    Informations forums :
    Inscription : Janvier 2006
    Messages : 152
    Par d�faut
    ahah ok merci

+ R�pondre � la discussion
Cette discussion est r�solue.

Discussions similaires

  1. Probl�me arr�t de threads
    Par Swandyr dans le forum G�n�ral Python
    R�ponses: 0
    Dernier message: 09/02/2012, 11h42
  2. Probl�me d'arr�t de Thread
    Par raspac dans le forum Concurrence et multi-thread
    R�ponses: 4
    Dernier message: 15/05/2009, 11h38
  3. Arr�t de Thread avec appel bloquant..
    Par dIwAmIb dans le forum C#
    R�ponses: 5
    Dernier message: 22/04/2009, 11h44
  4. Arr�t de thread
    Par Bayard dans le forum G�n�ral Python
    R�ponses: 4
    Dernier message: 06/03/2008, 10h26
  5. R�ponses: 7
    Dernier message: 18/09/2006, 22h01

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