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++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  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

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