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

C++ Discussion :

IHM figée durant traitement


Sujet :

C++

  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    223
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2007
    Messages : 223
    Par défaut IHM figée durant traitement
    Bonjour

    J'ai une petite application qui utilise une IHM. Cette application nécessite à un moment particulier, un traitement relativement long (de l'ordre de 4s à 5s). Le soucis, c'est que durant ce traitement, mon IHM reste figée.

    Mon traitement s'effectue correctement, et je récupère bien le résultat de mon calcul une fois les 4s ou 5s écoulées, et mon IHM redevient maniable.

    Comment puis-je palier à ce problème , afin d'avoir une IHM "disponible" même durant mon traitement ?

    Cordialement,
    PKO

  2. #2
    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,
    2 solutions :
    1/ Plus simple : Découper ton algo en petits segments que tu appelles dans OnIdle (ou l'équivalent de ton IHM)
    2/ Passer en multi-thread : 1 thread pour tes traitements - 1 thread pour ton IHM.

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    223
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2007
    Messages : 223
    Par défaut
    3DArchi > Bonjour et merci. La premiere solution est impossible dansm on cas. Le traitement effectué est en fait une copie de fichier. Il m'est donc impossible de le spliter.

    j'ai déja essayé la seconde methode :
    - Mon IHM
    - Un Thread qui se lance en parallèle de mon IHM, et qui effectue le traitement (il s'agit dans mon cas d'une copie de fichier, je le rappel).

    La valeur que je récupère dans ce traitement, correspond en fait au temps de copie nécessaire à mon fichier. Le problème, c'est que lorsque je lance ma copie dans un Thread, ce meme thread met 4s ou 5s à me renvoyer la valeur calculée. J'attend donc la fin de mon Thread, dans mon IHM. Et le fait d'attendre la fin de mon thread (avec "WaitForSingleObjectEx" par exemple), et bien ca fige encore mon application.

    Je suis un peu paumé là.

    Cordialement,
    PKO

  4. #4
    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 Altess Voir le message
    3DArchi > Bonjour et merci. La premiere solution est impossible dansm on cas. Le traitement effectué est en fait une copie de fichier. Il m'est donc impossible de le spliter.
    Rien ne t'empêche de copier ton fichier par petits blocs... mais j'imagine ça à voir avec une de tes questions précédentes (Estimer temps de copie d'un fichier).

    Citation Envoyé par Altess Voir le message
    j'ai déja essayé la seconde methode :
    - Mon IHM
    - Un Thread qui se lance en parallèle de mon IHM, et qui effectue le traitement (il s'agit dans mon cas d'une copie de fichier, je le rappel).

    La valeur que je récupère dans ce traitement, correspond en fait au temps de copie nécessaire à mon fichier. Le problème, c'est que lorsque je lance ma copie dans un Thread, ce meme thread met 4s ou 5s à me renvoyer la valeur calculée. J'attend donc la fin de mon Thread, dans mon IHM. Et le fait d'attendre la fin de mon thread (avec "WaitForSingleObjectEx" par exemple), et bien ca fige encore mon application.
    PKO
    Mets WaitForSingleObjectEx en non bloquant et teste le régulièrement (dans le OnIdle).

  5. #5
    Membre Expert
    Avatar de poukill
    Profil pro
    Inscrit en
    Février 2006
    Messages
    2 155
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 2 155
    Par défaut
    Le plus simple c'est certainement un thread + pattern Observateur.
    Comme ça tu lances un update() à la fin de ton traitement. Ca n'a rien de très compliqué : une classe Observable et une classe Observer, toutes deux classes mères à dériver. Plus d'infos sur le tuto de David

    (sinon tu as boost.signals aussi)

  6. #6
    Membre confirmé
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    223
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2007
    Messages : 223
    Par défaut
    Bonjour

    3DArchi > Ma fonction de test de fin de Thread est la suivante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    while(WaitForSingleObjectEx(h,INFINITE,TRUE)==WAIT_IO_COMPLETION);
    "h" étant le Handle de mon Thread.
    De quelle manière puis-je la rendre non-bloquante ?

    poukill > Merci pour le lien. Tout ceci me semble un peu lourd pour ce que j'ai à faire. Néanmoins, je garde ca de coté, le contenu est intéressant.

    Cordialement,
    PKO

  7. #7
    Membre Expert
    Avatar de poukill
    Profil pro
    Inscrit en
    Février 2006
    Messages
    2 155
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 2 155
    Par défaut
    Ben c'est pas compliqué du tout. Le principe est simple: ce n'est pas toi qui attend qu'une opération se termine mais l'opération qui, une fois terminée, va te signaler que son boulot est fini...
    Une sorte de "callback" quoi !

  8. #8
    Membre confirmé
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    223
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2007
    Messages : 223
    Par défaut
    Poukil > Le principe est clair, et il est sans doute très efficace. Le fait est que je trouve le principe trop lourd pour l'utilisation que j'en ferai. Je me penche dans un premier temps sur cette histoire de WaitForSingleObjectEx, si cette solution s'avère être sans issue, je me pencherais sur ta solution

  9. #9
    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
    (Sur le principe c'est un pattern Observateur qui ne dit pas son nom...)

    Sinon, il te faut remplacer :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    while(WaitForSingleObjectEx(h,INFINITE,TRUE)==WAIT_IO_COMPLETION);
    Par (en pseudo-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
     
    QuelqueChose::OnIdle()
    {
       if(DansLAttenteDunThread){
          DWORD dw_etat = WaitForSingleObjectEx(h,0,TRUE)
          switch(dw_etat){
              case WAIT_OBJECT_0 : // gérer la fin du thread
              break;
              case WAIT_TIMEOUT : // on ne fait rien, ce n'est pas fini
              break;
             default: // pas normal : gestion d'une erreur ?
                break;
          }
       }
    }
    QuelqueChose dépend de la façon dont ton thread est créé et de l'IHM que tu souhaites maintenir.

  10. #10
    Membre Expert
    Avatar de poukill
    Profil pro
    Inscrit en
    Février 2006
    Messages
    2 155
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 2 155
    Par défaut
    Citation Envoyé par 3DArchi Voir le message
    (Sur le principe c'est un pattern Observateur qui ne dit pas son nom...)
    Ok ^^
    Je connais pas trop les fonctions spécifiques de Windows, donc... ça je pouvais pas le renseigner!

  11. #11
    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 poukill Voir le message
    Ok ^^
    Je connais pas trop les fonctions spécifiques de Windows, donc... ça je pouvais pas le renseigner!
    Disons plutôt que c'est moi qui tire un peu sur le concept pour le faire rentrer dans ce schéma. Mais ton idée d'un pattern qui serait designé comme telle est certainement intéressante à creuser.

  12. #12
    Membre confirmé
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    223
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2007
    Messages : 223
    Par défaut
    Merci pour votre aide. Je vais voir ce que ça donne, et je vous tiens au courant.

    Cordialement,
    PKO

Discussions similaires

  1. Bar d'attente durant traitement
    Par skalimer0 dans le forum wxWidgets
    Réponses: 2
    Dernier message: 23/04/2009, 09h16
  2. Form qui se fige lors d'un traitement malgré thread
    Par SesechXP dans le forum Windows Forms
    Réponses: 7
    Dernier message: 31/05/2007, 11h46
  3. Séparer IHM et Traitement
    Par chris_wafer_2001 dans le forum MFC
    Réponses: 6
    Dernier message: 22/03/2006, 10h47
  4. Un Gif animé qui ne se fige pas lors des traitements ?
    Par delphi+ dans le forum Composants VCL
    Réponses: 11
    Dernier message: 18/03/2006, 10h31
  5. [C#] Comment suspendre le click durant un traitement ?
    Par sorcer1 dans le forum Windows Forms
    Réponses: 2
    Dernier message: 05/12/2005, 15h05

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