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 :

[MFC] Rafraichissement d'une CDialog avec barre de progression


Sujet :

MFC

  1. #1
    Membre à l'essai
    Inscrit en
    Février 2005
    Messages
    35
    Détails du profil
    Informations forums :
    Inscription : Février 2005
    Messages : 35
    Points : 20
    Points
    20
    Par défaut [MFC] Rafraichissement d'une CDialog avec barre de progression
    Salut à tous,

    Voici le problème : j'ai une boîte de dialogue dont l'affichage doit se mettre à jour en parallèle avec un gros traitement (des chargements à partir de fichiers).

    Pour ce faire, j'ai la fonction suivante :

    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
     
    long CInitialisationDialog::UpdateGUI(WPARAM wparam,LPARAM lparam)
    {
    	if (ind ==0)
    	{
    		//traitement 0
    	}
     
    // etc...
    	if (ind == 5)
    	{
    		// traitement 5
    	}
     
    	UpdateData(false);
    	ind++;
     
    	PumpMessages();
     
    	return 0;
    }
    En gros, j'ai découpé le traitement en plusieurs plus petit. Dans chaque sous-traitement, je mets à jour une CString qui doit s'afficher dans ma CDialog. Le but du jeu est d'affecter cette fonction à un thread qui effectue chaque sous-traitement en fonction de l'entier ind (qui est incrémenté à chaque itération).

    J'initialise le thread à cet endroit :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    BOOL CInitialisationDialog::OnInitDialog()
    {
    	CDialog::OnInitDialog();
     
    	m_progress.SetRange(0,6);
    	m_progress.SetPos(0);
     
    	AfxBeginThread(InitThread,GetSafeHwnd(),THREAD_PRIORITY_HIGHEST);
     
    	return TRUE;  // return TRUE unless you set the focus to a control
    	// EXCEPTION: OCX Property Pages should return FALSE
    }
    Et la fonction du thread est la suivante :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    UINT CInitialisationDialog::InitThread(LPVOID pParam)
    {
    	HWND hWnd= reinterpret_cast< HWND >( pParam) ;
    	::PostMessage(hWnd,WM_TEST,0,0) ;
     
    	return 0;
    }
    En gros, j'envoie un message WM_TEST à chaque itération. J'ai bien pensé à ajouter cette ligne dans la message map:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ON_MESSAGE(WM_TEST, CInitialisationDialog::UpdateGUI)
    Voilà, je pense avoir tout bien (j'ai essayé de recouper toutes les infos trouvées sur le forum), mais rien ne se passe à l'affichage (pour le moment, je ne gère pas trop la progress bar, mais ça devrait déjà marcher avec la CString). Vous avez des idées ?

    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
    Points : 17 323
    Points
    17 323
    Par défaut
    salut,
    tu as regardé la faq pour le message privé ?
    http://c.developpez.com/faq/vc/?page...PrivateMessage
    sinon tu as mis des points d'arrêts pour vérifier si les fonctions sont appelées ?
    autre point : moi je ferais le traitement dans le thread et enverrai un message pour le rafraichissement du gui.

  3. #3
    Membre à l'essai
    Inscrit en
    Février 2005
    Messages
    35
    Détails du profil
    Informations forums :
    Inscription : Février 2005
    Messages : 35
    Points : 20
    Points
    20
    Par défaut
    Youhou, ça marche !!!!

    Voilà comment j'ai fait :

    1) Je ne découpe plus le traitement en plusieurs sous traitements (donc l'entier ind ne sert plus à rien), mais j'appelle UpdateData et PumpMessages régulièrement

    2) Je ne lance plus le thread dans OnInitDialog, mais juste quand OnPaint est appelé la première fois.

    Voilà, ça doit être tout.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [API HTML5] Charger une image avec barre de progression
    Par ksomda dans le forum Général JavaScript
    Réponses: 1
    Dernier message: 02/04/2014, 08h50
  2. Préchargement d'une image avec barre de progression
    Par arnolem dans le forum Téléchargez
    Réponses: 0
    Dernier message: 30/09/2011, 16h46
  3. Comment arreter le rafraichissement d'une page avec un popup
    Par Wanty dans le forum Général JavaScript
    Réponses: 2
    Dernier message: 11/08/2005, 14h44
  4. [MFC] CTabCtrl dans une CDialog
    Par eyghon dans le forum MFC
    Réponses: 1
    Dernier message: 29/04/2005, 19h31
  5. [MFC][DLL]Afficher une CDialog ?
    Par matazz dans le forum MFC
    Réponses: 13
    Dernier message: 13/04/2005, 13h47

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