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

Développement 2D, 3D et Jeux Discussion :

fenetre d'une appli openGl-MFC qui freeze !


Sujet :

Développement 2D, 3D et Jeux

  1. #1
    Membre du Club
    Inscrit en
    Janvier 2006
    Messages
    99
    Détails du profil
    Informations forums :
    Inscription : Janvier 2006
    Messages : 99
    Points : 52
    Points
    52
    Par défaut fenetre d'une appli openGl-MFC qui freeze !
    Bonjour,

    je fait un modeler/loader 3D en MFC et OpenGl. Les fichiers que je charge peuvent demander beaucoup de temps (plusieurs minutes) avant d'être entierement lus et traités (calcul d'union, de soustraction entre des volumes 3D, tessalisation).
    Pendant ce temps la moindre interaction avec la fenetre de cette appli (click, redimensionnement,...) plante l'affichage de celle-ci, mais sans planter le chargement. Enfin ce n'est pas du tout confortable pour l'utilisateur...

    Pendant la serialisation, j'essaye de rendre ma fenetre inactive ( pMainWnd->EnableWindow(false) ), ou encore de bloquer les boucles d'affichages opengl, mais rien n'y fait !
    Vous avez peut etre une idée pour me dépatouiller avec cette histoire ?

    Merci, bon aprem.
    Jc.

  2. #2
    Rédacteur
    Avatar de MrDuChnok
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2002
    Messages
    2 112
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Juin 2002
    Messages : 2 112
    Points : 4 240
    Points
    4 240
    Par défaut
    Salut,

    Si ton chargement prend plusieurs minutes, et que tu ne rend pas la main à ton application, elle occupe tout le temps processeurs, et ne peux donc pas se mettre à jour.

    Tu as essayé en créant un thread pour charger ton fichier ? Ainsi tu pourrai continuer à appelé ta fonction de gestion des clicks / redimensionnement de ta fenêtre tout en chargeant ton fichier.

    Par contre ça va compliquer un peu ton projet, car il faudra gérer une synchronisation entre ton thread de chargement du modèle et ton thread principale.

    Enfin c'est la première solution qui me vient, il y a peut être mieux.
    Si vous jugez mon post utile dans la résolution de votre problème, n'hésitez pas à utiliser le système de vote afin d'améliorer la qualité du forum

  3. #3
    Expert éminent sénior

    Avatar de fearyourself
    Homme Profil pro
    Ingénieur Informaticien Senior
    Inscrit en
    Décembre 2005
    Messages
    5 121
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Ingénieur Informaticien Senior
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2005
    Messages : 5 121
    Points : 11 877
    Points
    11 877
    Par défaut
    Le système d'exploitation s'attends à ce que tout programme redessine la fenêtre si c'est nécessaire. Si le programme est occupé par trop de calculs alors on a un problème comme ce que tu décris.

    Pour le résoudre, une solution est de mettre une image noire et un titre "Patience..." ou d'assurer que l'affichage continue de facon régulière...

    Citation Envoyé par jcloupgarou
    Pendant la serialisation, j'essaye de rendre ma fenetre inactive ( pMainWnd->EnableWindow(false) ), ou encore de bloquer les boucles d'affichages opengl, mais rien n'y fait !
    Vous avez peut etre une idée pour me dépatouiller avec cette histoire ?
    Au contraire, tu devrais mettre en place une deuxième thread pour continuer l'affichage mais désactiver la gestion clavier/souris...

    Une autre solution est d'arriver à couper la serialisation en morceaux et donc tous les Xms, tu appelles l'affichage...

    Dernière solution est de faire l'inverse, la boucle qui appelle l'affichage vérifie si on est mode sérialisation et appelle la fonction serialize(tmps) qui peut commencer/reprendre son travail pendant tmps milli-secondes.

    Bien sûr cela demande de pouvoir arrêter et reprendre mais bon...

    Jc

  4. #4
    Membre du Club
    Inscrit en
    Janvier 2006
    Messages
    99
    Détails du profil
    Informations forums :
    Inscription : Janvier 2006
    Messages : 99
    Points : 52
    Points
    52
    Par défaut
    Merci, j'avais pensé à créer un deuxieme processus pour la partie load, mais ca devient un peu compliqué. Il n'y a pas une solution pour reduire la fenetre principale de mon appli et n'afficher que sa toolbar (barre en haut de la fenetre) comme sous les mac je crois, ou pour la rendre totalement inactive...

  5. #5
    Membre du Club
    Inscrit en
    Janvier 2006
    Messages
    99
    Détails du profil
    Informations forums :
    Inscription : Janvier 2006
    Messages : 99
    Points : 52
    Points
    52
    Par défaut
    Ok, je vais essayer de passer de la serialisation a l'affichage et, vis et versa. Ca m'a l'air plus simple que de me mettre au multithread, j'y connais rien ;o)...
    Merci, je vous tiens au courant !

  6. #6
    Membre du Club
    Inscrit en
    Janvier 2006
    Messages
    99
    Détails du profil
    Informations forums :
    Inscription : Janvier 2006
    Messages : 99
    Points : 52
    Points
    52
    Par défaut
    Etant donnée ma structure de données, c difficile de relancer l'affichage pendant la serialisation.
    Je peux pointer sur ma fenetre CWnd avec AfxGetMainWnd(), mais je n'arrive pas à forcer l'affichage. Quelle methode de CWnd faut il utiliser ? J'ai un peu tout essayer... Merci de me sortir la tete de l'eau !

  7. #7
    Rédacteur
    Avatar de Laurent Gomila
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2003
    Messages
    10 651
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Points : 15 920
    Points
    15 920
    Par défaut
    Tu devrais quand même utiliser un thread, ce serait beaucoup plus propre au niveau de l'utilisation. Surtout que pendant que tu vas charger tes données, tout ce que tu voudras faire c'est que ta fenêtre tourne normalement, aucun conflit en vue donc. Et puis je pense même que tu te feras moins ch*** à le programmer, par rapport à l'idée sur laquelle tu es parti.

  8. #8
    Rédacteur
    Avatar de MrDuChnok
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2002
    Messages
    2 112
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Juin 2002
    Messages : 2 112
    Points : 4 240
    Points
    4 240
    Par défaut
    Moi aussi je trouve que le thread serai beaucoup plus simple et ici adapté dans ta situation.

    Si tu ne connais pas les threads, ce cas ne sera pas le plus compliquer à aborder, et donc te permettera d'en apprendre sur le sujet, en commençant par quelque chose de simple.
    Si vous jugez mon post utile dans la résolution de votre problème, n'hésitez pas à utiliser le système de vote afin d'améliorer la qualité du forum

  9. #9
    Membre émérite
    Avatar de Ti-R
    Homme Profil pro
    Ingénieur R&D
    Inscrit en
    Avril 2003
    Messages
    1 683
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2003
    Messages : 1 683
    Points : 2 568
    Points
    2 568
    Par défaut
    Les threads c'est relativement simple en plus.

    Je dirais que même très simple sous windows.

  10. #10
    Membre du Club
    Inscrit en
    Janvier 2006
    Messages
    99
    Détails du profil
    Informations forums :
    Inscription : Janvier 2006
    Messages : 99
    Points : 52
    Points
    52
    Par défaut
    OK, c parti pour les thread alors vu que j'ai droit a une incitation collegiale !
    De toute facon, j'arrive rien a faire avec l'idée précédente...
    Merci m'sieurs-dames

  11. #11
    Membre du Club
    Inscrit en
    Janvier 2006
    Messages
    99
    Détails du profil
    Informations forums :
    Inscription : Janvier 2006
    Messages : 99
    Points : 52
    Points
    52
    Par défaut
    J'ai trouvé un truc sympa sur la FAQ : detecter les messages stimulant la fenetre (genre click, minimize...) et qui empeche que le traitement longué ne freeze l'affichage.
    Je rappelle le bout le code pour les curieux :

    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
    /*static */void PumpMessages() 
    { 
       // Handle dialog messages 
        MSG msg; 
        while(PeekMessage(&msg, NULL, 0, 0, PM_REMOVE)) 
        { 
            if (!AfxGetApp()->PreTranslateMessage(&msg)) 
          { 
             TranslateMessage(&msg); 
             DispatchMessage(&msg); 
         }            
         AfxGetApp()->OnIdle(0);   // updates user interface 
        AfxGetApp()->OnIdle(1);   // frees temporary objects 
        } 
    }
    Ca marche du feu de dieu dans mon cas... Les threads, ce sera pour plus tard !
    Merci, en tout cas.

  12. #12
    Rédacteur
    Avatar de bafman
    Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2003
    Messages
    2 574
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Industrie

    Informations forums :
    Inscription : Novembre 2003
    Messages : 2 574
    Points : 5 323
    Points
    5 323
    Par défaut
    allez je fais mon lourd...
    et si tu passe une autre fenetre par dessus ta fenetre pendant qu'il travail ? ça donne quoi ?
    * Il est infiniment plus simple de faire rapidement un code qui marche que de faire un code rapide qui marche
    * pour faciliter les recherches, n'oubliez pas de voter pour les réponses pertinentes
    Mes articles

  13. #13
    Membre du Club
    Inscrit en
    Janvier 2006
    Messages
    99
    Détails du profil
    Informations forums :
    Inscription : Janvier 2006
    Messages : 99
    Points : 52
    Points
    52
    Par défaut
    Il ne se passe rien de particulier... L'affichage est mis a jour malgrés la lourdeur du traitement effectué par l'appli... Ca marche vraiment tres tres bien !

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

Discussions similaires

  1. Réponses: 1
    Dernier message: 19/12/2010, 01h32
  2. Utiliser un cookie d'un webservice C# dans une appli C++ MFC
    Par manhattan.project dans le forum MFC
    Réponses: 1
    Dernier message: 17/04/2007, 08h55
  3. Réponses: 2
    Dernier message: 10/01/2007, 13h33
  4. Réponses: 3
    Dernier message: 26/05/2006, 17h35
  5. Fenetre fille Flash dans une appli openGL
    Par venomelektro dans le forum OpenGL
    Réponses: 1
    Dernier message: 14/02/2006, 16h48

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