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 :

Thread


Sujet :

MFC

  1. #1
    Membre confirmé Avatar de lenouvo
    Profil pro
    Inscrit en
    Janvier 2003
    Messages
    252
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2003
    Messages : 252
    Par défaut Thread
    bonjour,
    voilà j'ai réalisé un thread, mais le problème est que durant ce thread, ma fenêtre principale avec le menu devient figée comme si elle plantait, et c'est seulement lorsque le thread est fini, que la fenêtre est de nouveau normale.
    Y a t il moyen d'empecher ca?

  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
    tu menages des temps de pause dans ton thread ? ou il tourne en boucle en permanence -> cpu qui monte en fleche .

  3. #3
    Membre confirmé Avatar de lenouvo
    Profil pro
    Inscrit en
    Janvier 2003
    Messages
    252
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2003
    Messages : 252
    Par défaut
    il tourne en boucle
    car c'est un thread de recherche de fenêtre avec une boucle While et la fonction EnumWindow
    comment ménager des temps d'attente?fonction Sleep? ca ne change pas grd chose

  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 lenouvo
    il tourne en boucle
    car c'est un thread de recherche de fenêtre avec une boucle While et la fonction EnumWindow
    comment ménager des temps d'attente?fonction Sleep? ca ne change pas grd chose
    ça ne doit pas prendre des plombes ,tu n'oublis pas de sortir du thread apres ?
    d'ou tourne en rond -> cpu elevé -> thread principal gelé

  5. #5
    Membre confirmé Avatar de lenouvo
    Profil pro
    Inscrit en
    Janvier 2003
    Messages
    252
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2003
    Messages : 252
    Par défaut
    bah non je ne crois pas..
    voici un bout de mon code :
    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
     
    //le lancement de mon thread
    	CSv2View MonObj;
    	HANDLE hThread;
    	hThread = CreateThread(NULL,0,MonObj.MyThread,NULL,0,NULL);
    	if ( NULL == hThread )
    		::MessageBox(NULL,TEXT("pas de thread"),TEXT("Test"),MB_OK);
    	else
    	{
    		DWORD dwWait;
    		dwWait = WaitForSingleObject(hThread,INFINITE);
    		if (WAIT_OBJECT_0 == dwWait)
    		CloseHandle(hThread);
    	}
     
    //Mon thread
    DWORD WINAPI CSv2View::MyThread(LPVOID p)
    {
     
    	bool Here=false;
    	while(Here==false){
    		if(EnumWindows((WNDENUMPROC)Obs,0)==true){
    			EnumWindows((WNDENUMPROC)Obs,0);
    		}	
    		else{
    			Here=true;
    		}
    	}
    	return 0;
    }
     
    //ma fonction que j'appele dans mon thread  :lol: 
    BOOL CALLBACK Obs(HWND hwnd, LPARAM lparam)
    {
    	CString s;
    	WCHAR s2[50];
    	GetWindowText(hwnd,s2,50);
    	s=s2;
    	if(s.Find(TEXT("nom de ma fenetre que je cherche"))!=-1){
    	//traitement 
    		return FALSE;
    	}
    	return TRUE;
    }
    voila ^^

  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
    il me semble que enumWindows appel la callback tant que c'est bon apres il sort et renvoie true si traitement ok .
    dans ton code il ne sortira jamais vu que tu le relances systematiquement;
    et comme il doit toujours repondre true....

  7. #7
    Membre confirmé Avatar de lenouvo
    Profil pro
    Inscrit en
    Janvier 2003
    Messages
    252
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2003
    Messages : 252
    Par défaut
    hm hm ok donc ca serait :
    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
     
    DWORD WINAPI CSv2View::MyThread(LPVOID p)
    {
     
       bool Here=false;
       while(Here==false){
          if(EnumWindows((WNDENUMPROC)Obs,0)==false){
             //on ne fait rien
          }   
          else{
             Here=true;
          }
       }
       return 0;
    }
    ?

  8. #8
    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
    oui le temps d'execution de EnumWindows doit etre faible ,j'ai bien peur que ton thread tourne tres vite et prenne des ressources cpu.
    a tester ...
    si le thread est temporaire ,c'est a dire liée a une condition qui devrait arriver dans peu de temps ok ,sinon ça va geler ton application.

  9. #9
    Membre confirmé Avatar de lenouvo
    Profil pro
    Inscrit en
    Janvier 2003
    Messages
    252
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2003
    Messages : 252
    Par défaut
    le thread est temporaire, mais la condition arrive assez tard, une dizaine de secondes, ce qui effectivement freeze mon appli.
    Si je rajoute un Sleep par exemple
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
          if(EnumWindows((WNDENUMPROC)Obs,0)==false){
             //on attend
    Sleep(2000);
          }
    es ce que ca prendrait moins de ressources Cpu?

  10. #10
    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
    oui .

  11. #11
    Membre confirmé Avatar de lenouvo
    Profil pro
    Inscrit en
    Janvier 2003
    Messages
    252
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2003
    Messages : 252
    Par défaut
    ok je vais tester ca bientot j'attend avant de mettre en résolu
    merci farscape

  12. #12
    Membre éprouvé
    Inscrit en
    Avril 2004
    Messages
    122
    Détails du profil
    Informations forums :
    Inscription : Avril 2004
    Messages : 122
    Par défaut
    Salut,
    D'après le code que tu as montré, de toute façon ton appli sera bloqué car tu fais un WaitForSingleObject pour attendre la fin de ton thread, si tu ne veux pas que ton thread pricipal soit bloqué et qu'il traite toujours les messages windows, regarde du côté de MsgWaitForMultipleObjects.

  13. #13
    Membre confirmé Avatar de lenouvo
    Profil pro
    Inscrit en
    Janvier 2003
    Messages
    252
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2003
    Messages : 252
    Par défaut
    ah tiens je savais pas non plus. Merci de l'info je vais me renseigner

  14. #14
    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 Brouzouf
    Salut,
    D'après le code que tu as montré, de toute façon ton appli sera bloqué car tu fais un WaitForSingleObject pour attendre la fin de ton thread, si tu ne veux pas que ton thread pricipal soit bloqué et qu'il traite toujours les messages windows, regarde du côté de MsgWaitForMultipleObjects.
    Certes je n'avais pas fais attention a ça,
    Pourquoi attendre ?
    Passe le handle de fenêtre a ton thread et quand celui sort parce que les conditions sont remplies envoie un message privé à la dialogue à partir du thread.

  15. #15
    Membre confirmé Avatar de lenouvo
    Profil pro
    Inscrit en
    Janvier 2003
    Messages
    252
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2003
    Messages : 252
    Par défaut
    hm, mais comme c'est une fenêtre indépendante de mon programme, ca va marcher?

    sinon merci énormément pour cette fonction MsgWaitForMultipleObjects, ca marche super niquel, ma fenêtre n'est plus du tout bloquée et c'est super propre, merci

Discussions similaires

  1. Tri multi-threadé
    Par Tifauv' dans le forum C
    Réponses: 8
    Dernier message: 28/06/2007, 09h00
  2. récupérer la valeur de sortie d'un thread
    Par jakouz dans le forum Langage
    Réponses: 3
    Dernier message: 31/07/2002, 11h28
  3. Programmer des threads
    Par haypo dans le forum C
    Réponses: 6
    Dernier message: 02/07/2002, 13h53
  4. Réponses: 5
    Dernier message: 12/06/2002, 15h12
  5. [Kylix] Pb de Thread !!
    Par Anonymous dans le forum EDI
    Réponses: 1
    Dernier message: 25/04/2002, 13h53

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