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 :

Probl�me de thread et temps CPU


Sujet :

MFC

  1. #1
    Membre confirm�
    Profil pro
    Inscrit en
    Septembre 2008
    Messages
    147
    D�tails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2008
    Messages : 147
    Par d�faut Probl�me de thread et temps CPU
    Bonjour,

    Mon probl�me est le suivant :
    J'ai un programme (MFC) qui fait des calculs assez lourd et qui consomment pas mal de temps CPU.
    Or j'ai besoin d'afficher un �tat de mes calculs au travers de voyant (CStatic avec 2 bitmaps que je switch quand n�cessaire).

    Le probl�me vient de l'affichage de ces voyants qui ne se rafraichissent pas.

    J'ai fait un thread avec la classe CWinThread qui g�re le toggle des voyants.
    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
     
    CMyClass::CMyClass()
    {
    	m_NbEvent = 0;
    	m_MyEvent = NULL;
    	m_bStatus=THR_STOPPED;					// Thread arreté
    }
     
    CMyClass::~CMyClass()
    {
    	if (m_MyEvent ) {
    		for (int EvtI = 0 ; EvtI < m_NbEvent ; EvtI++)
    			CloseHandle(m_MyEvent[EvtI]);
    		delete m_MyEvent;
    	}
    }
     
    void CMyClass::ToggleBitmap(int nIndex)
    {
    	::SetEvent(m_MyEvent[nIndex]);
    }
     
    void CMyClass::SetNbEvent(int iMaxEvent)
    {
    	m_NbEvent = iMaxEvent;
    	m_MyEvent = new HANDLE[m_NbEvent];
    	for (int EvtI = 0 ; EvtI < m_NbEvent ; EvtI++)
    		m_MyEvent[EvtI] = CreateEvent(NULL, FALSE, FALSE, NULL);
    }
     
    BOOL CMyClass::InitInstance()
    {
    	m_bStatus= THR_RUNNING;
    	DWORD Ret;
    	int nEvent;
     
    	// Debut boucle principale
    	while (m_bStatus==THR_RUNNING) {
     
    		Ret = ::WaitForMultipleObjects(m_NbEvent, m_MyEvent , FALSE, INFINITE);
    		nEvent = Ret - WAIT_OBJECT_0;
    		::ResetEvent(m_MyEvent[nEvent]);
     
    		if (m_MainDlg) {
    			if (m_MainDlg->m_cLight[nEvent])
    				m_MainDlg->m_cLight[nEvent]->SetBitmap(m_MainDlg->m_bGreen);
    		}
    	};
    	m_bStatus= THR_STOPPED;
    	while (m_bStatus!=THR_STOPPED_ACK) Sleep (2000);
     
    	return TRUE;
    }
    Le thread est cr�� avec une priorit� normale (par d�faut).

  2. #2
    Expert �minent
    Avatar de M�dinoc
    Homme Profil pro
    D�veloppeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 397
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 41
    Localisation : France

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 397
    Par d�faut
    Franchement, ce que je conseillerais, ce serait r�duire la priorit� du thread de travail.

    Et peut-�tre aussi, �viter d'utiliser une attente bloquante dans ton thread d'UI. Pourquoi ne pas plut�t le pr�venir avec un PostMessage() (asynchrone) ou un SendMessage() (synchrone) ?
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parl� avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  3. #3
    Membre confirm�
    Profil pro
    Inscrit en
    Septembre 2008
    Messages
    147
    D�tails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2008
    Messages : 147
    Par d�faut
    Je ne peux pas r�duire la priorit� du thread de travail car c'est du quasi temps r�el.
    Il me semblait que le PostMessage n'est possible qu'avec une fen�tre, me trompe-je ?

  4. #4
    Expert �minent
    Avatar de M�dinoc
    Homme Profil pro
    D�veloppeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 397
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 41
    Localisation : France

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 397
    Par d�faut
    �a n'est possible que vers une fen�tre, mais ton thread d'UI est suppos� en avoir une, ou �a ne serait pas un thread d'UI.

    D�j�, rien qu'un CStatic, c'est d�j� une fen�tre.
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parl� avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  5. #5
    R�dacteur
    Avatar de 3DArchi
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    7 634
    D�tails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 7 634
    Par d�faut
    Salut,
    Quelques remarques :
    1/ Comment sors-tu de la boucle ? m_bStatus est modifi�e ailleurs? Alors il te faudrait peut �tre v�rifi� l'acc�s concurrent (Mutex, section critique).
    2/ Ton thread d�rive de CWinThread ? Normalement, tu ne devrais pas faire tout le boulot dans InitInstance mais comme dans le thread principal.
    3/ Ta gestion de la fin du thread (while (m_bStatus!=THR_STOPPED_ACK) Sleep (2000); ) est limite. Tu devrais utiliser un m�canisme de synchronisation sp�cifique pour terminer ton thread (un �v�nement de fin de thread par expl).
    4/ Normalement, il n'est pas recommand� d'�changer des MFC entre les threads mais d'�changer leur handle. Donc si m_MainDlg est l'instance cr�� dans le thread principal, alors tu devrais plut�t �changer le HWND et faire ensuite un CWnd::FromHandle ou CWnd::FromHandlePermanent.
    5/Post/SendMessage prennent en param�tre un HWND. Mais rien n'emp�che de cr�er une fen�tre 'bo�te aux lettres' : Message-Only Windows.
    5 bis/ Pour rappel, le comportement de SendMessage entre thread diff�rents est un peu tordu.
    6/ C'est le thread de travail qui pianote sur le tableau d'�v�nements? Pourquoi avoir fait un thread s�par� du thread principal? Tu pouvais rester en �coute dans le thread principale avec MsgWaitForMultipleObjectsEx ? Ou alors faire du 'polling' dans OnIdle?

  6. #6
    Membre confirm�
    Profil pro
    Inscrit en
    Septembre 2008
    Messages
    147
    D�tails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2008
    Messages : 147
    Par d�faut
    Ce que je ne comprend pas c'est pourquoi les �v�nements qui sont lev�s ne d�bloque pas le WaitForMultipleObjects ? En fait c'est uniquement � la fin de mes calculs qu'ils font effet.

    Citation Envoy� par M�dinoc Voir le message
    �a n'est possible que vers une fen�tre, mais ton thread d'UI est suppos� en avoir une, ou �a ne serait pas un thread d'UI.

    D�j�, rien qu'un CStatic, c'est d�j� une fen�tre.
    Qu'est ce que tu entend par thread d'UI, est ce que c'est le thread principal ?

    Citation Envoy� par 3DArchi Voir le message
    Salut,
    Quelques remarques :
    1/ Comment sors-tu de la boucle ? m_bStatus est modifi�e ailleurs? Alors il te faudrait peut �tre v�rifi� l'acc�s concurrent (Mutex, section critique).
    Pour la sortie du thread j'ai pas mis tout le code, mais je suis � peu pr�s sur de mon coup.

    Citation Envoy� par 3DArchi Voir le message
    2/ Ton thread d�rive de CWinThread ? Normalement, tu ne devrais pas faire tout le boulot dans InitInstance mais comme dans le thread principal.
    Tout � fait exact, d'ailleurs je l'ai d�plac� dans Run.

    Citation Envoy� par 3DArchi Voir le message
    3/ Ta gestion de la fin du thread (while (m_bStatus!=THR_STOPPED_ACK) Sleep (2000); ) est limite. Tu devrais utiliser un m�canisme de synchronisation sp�cifique pour terminer ton thread (un �v�nement de fin de thread par expl).
    J'ai cr�� le thread en AutoDelete (et franchement cette partie vient d'un copier coller du code d'un coll�gue et je suis pas un expert).

    Citation Envoy� par 3DArchi Voir le message
    4/ Normalement, il n'est pas recommand� d'�changer des MFC entre les threads mais d'�changer leur handle. Donc si m_MainDlg est l'instance cr�� dans le thread principal, alors tu devrais plut�t �changer le HWND et faire ensuite un CWnd::FromHandle ou CWnd::FromHandlePermanent.
    m_MainDlg est le pointeur sur ma CDialog.


    Citation Envoy� par 3DArchi Voir le message
    5/Post/SendMessage prennent en param�tre un HWND. Mais rien n'emp�che de cr�er une fen�tre 'bo�te aux lettres' : Message-Only Windows.
    5 bis/ Pour rappel, le comportement de SendMessage entre thread diff�rents est un peu tordu.
    Je ne savais pas.

    Citation Envoy� par 3DArchi Voir le message
    6/ C'est le thread de travail qui pianote sur le tableau d'�v�nements? Pourquoi avoir fait un thread s�par� du thread principal? Tu pouvais rester en �coute dans le thread principale avec MsgWaitForMultipleObjectsEx ? Ou alors faire du 'polling' dans OnIdle?
    MsgWaitForMultipleObjectsEx est bloquant non ? Du coup je ne pourrais plus faire de traitement dans mon thread principal.
    Je ne sais pas ce qu'est le polling.

  7. #7
    R�dacteur
    Avatar de 3DArchi
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    7 634
    D�tails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 7 634
    Par d�faut
    Citation Envoy� par coincoin73 Voir le message
    MsgWaitForMultipleObjectsEx est bloquant non ? Du coup je ne pourrais plus faire de traitement dans mon thread principal.
    Il est bloquant sur les �v�nements et sur la r�ception de message. Donc, si dans ton thread principal tu ne fait rien d'autre que d'attendre des interactions IHM, cela doit pouvoir suffire. A essayer?

    Citation Envoy� par coincoin73 Voir le message
    Je ne sais pas ce qu'est le polling.
    Le polling consiste � demander r�guli�rement l'�tat plut�t qu'� se mettre en attente. L'id�e dans ton cas est alors: Dans le OnIdle de ton thread principal tu fais un WaitForMultipleObjects non bloquant, et si certains sont positionn�s tu fais le traitement, sinon, tu retourne. R�guli�rement, OnIdle est appel� sans pour autant bloquer ton appli.

Discussions similaires

  1. Temps CPU et temps d'�x�cution
    Par t_om84 dans le forum G�n�ral Python
    R�ponses: 1
    Dernier message: 04/09/2005, 12h27
  2. Temps cpu
    Par chama dans le forum Administration syst�me
    R�ponses: 5
    Dernier message: 25/07/2005, 11h41
  3. Aide pour l'analyse d'un probl�me de gestion de temps
    Par PAINCO dans le forum D�cisions SGBD
    R�ponses: 8
    Dernier message: 03/06/2005, 15h49
  4. Thread et occupation CPU
    Par kramer dans le forum C++Builder
    R�ponses: 11
    Dernier message: 24/05/2005, 21h57
  5. [VC++6][DX9] Probl�me de thread lors d'un blit ...
    Par grandjouff dans le forum DirectX
    R�ponses: 2
    Dernier message: 12/06/2003, 22h22

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