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++Builder Discussion :

Affichage d'une fenetre pendant qu'une fonction tourne au second plan


Sujet :

C++Builder

  1. #1
    Membre à l'essai
    Inscrit en
    Mai 2006
    Messages
    17
    Détails du profil
    Informations personnelles :
    Âge : 38

    Informations forums :
    Inscription : Mai 2006
    Messages : 17
    Points : 13
    Points
    13
    Par défaut Affichage d'une fenetre pendant qu'une fonction tourne au second plan
    Bonjour.
    Voila, dans une application, j'ai une fonction de calcule qui est longue a s'executer. J'aurai aime afficher une fenetre qui permettrai a l'utilisateur d'annuler le calcul en court.

    Mon problem est donc le suivant:
    Je ne vois pas comment coder afin que la fenetre s'ouvre et que la fonction continu a s'executer au second plan?

    Par avance merci

  2. #2
    Responsable Magazine

    Avatar de pottiez
    Homme Profil pro
    Développeur C++
    Inscrit en
    Novembre 2005
    Messages
    7 152
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Développeur C++
    Secteur : Industrie

    Informations forums :
    Inscription : Novembre 2005
    Messages : 7 152
    Points : 22 087
    Points
    22 087
    Par défaut
    Il suffit de faire afficher ta fenetre au debut de ta fonction, elle sera affiché et ta fonction continura ensuite à s'executer.
    Quand une réponse vous a été utile, pensez à utiliser le nouveau système de notation

    Lisez le magazine de developpez.com.
    Mes tutos : http://pottiez.developpez.com

    La FAQ BCB -> 642 Questions/Réponses, si vous voulez participer, contactez moi. Aide de BCB6 en français

    N'oubliez pas que l'aide existe et est affichée sous simple pression de la touche F1 , une touche c'est plus rapide que tout un message .

  3. #3
    Membre éclairé
    Avatar de Interruption13h
    Inscrit en
    Août 2005
    Messages
    603
    Détails du profil
    Informations forums :
    Inscription : Août 2005
    Messages : 603
    Points : 786
    Points
    786
    Par défaut bool annuler
    salut !

    Il faudera que tu nous donne un peu de détaille sur ton calcule long

    Bon,je prend un example ou ton calcule long se fait dans une boucle et à une condition d'une variable genre :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
     
    while(condition)
              {
               //Mon traitement long ;-)
              }
    donc pour que tu permet à ton user à annuler ton calcule long quand il veut,je propose une solution,est de mettre une autre varaible booléene dans la condition de while :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
     
    while(condition & !annuler)
            {
             //Toujours mon traitement long ;-)
            }
    avec la varaible annuler initialement vaut false,et déclarée dans le corps de ta première TForm ,pour être accédée facilement par la deuxième form(qui contient le bouton annuler) .

    Comme ça dans la deuxième form,le bouton annuler change la valeur de la variable annuler de la 1ere form en false,ce qui arrête la boucle .





    Donc en résumé :

    déclaration de la varaible booléen annuler :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
     
    class TForm1 : public TForm
    {
    __published: // Composants gérés par l'EDI
    ...
    private:
    ...
    public:
    ...
    bool annuler;
     
    };


    Lancement du calcule :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
     
    Form2->ShowModal();
    annuler=false;
     
    while(condition && !annuler)
            {
            //traitement long...
            }
     
    Form2->Close();
    et dans ta form2,dans l'évenement OnClick de ton bouton Annuler :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
     
    Form1->annuler=true;




    donc voila,c'est juste une idée, espérant que ça t'aidderai !

    ++
    Plus tu prends part aux joies et chagrins des gens, plus ils te sont proches et chers. Mais c'est le chagrin et les problèmes qui vous rapprochent le plus.

    (Mark TWAIN)

  4. #4
    Membre chevronné
    Avatar de DjmSoftware
    Homme Profil pro
    Responsable de compte
    Inscrit en
    Mars 2002
    Messages
    1 044
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Responsable de compte
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mars 2002
    Messages : 1 044
    Points : 2 187
    Points
    2 187
    Billets dans le blog
    1
    Par défaut
    bonsoir,
    tu peux utiliser un Thread qui effectuera le traitement tout en travaillant sur l'application principale
    cordialement
    vous trouverez mes tutoriels à l'adresse suivante: http://djmsoftware.developpez.com/
    je vous en souhaite une excellente lecture ...

    A lire : Les règles du forum

  5. #5
    Membre à l'essai
    Inscrit en
    Mai 2006
    Messages
    17
    Détails du profil
    Informations personnelles :
    Âge : 38

    Informations forums :
    Inscription : Mai 2006
    Messages : 17
    Points : 13
    Points
    13
    Par défaut
    J'ai essaie la technique de Interruption13h et pottiez mon appli tourne a fond et empeche donc tte interaction avec la fenetre ouverte!!!

    Pour plus de detail de mon calcul long:

    En faite je fais plusieurs chose a la suite, c'est des suite de boucle "while" et "for" parfois imbriqué avec des "if" dedans.

    Ce que j'ai fais c'est donc d'ouvrir ma fenetre
    et tt au long dans mes conditions de boucle j'ai rajouté des teste
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    while (test!=true)
    ...
    for (int i=0; test!=true)
    ...
    et dans ma fenetre j'ai mis un bouton et lorsqu'on clique dessus
    Mais comme je l'ai dit mon appli tourne a fond, quelqu'un aurai une idee???

    Merci.


    Mabiche103

  6. #6
    Responsable Magazine

    Avatar de pottiez
    Homme Profil pro
    Développeur C++
    Inscrit en
    Novembre 2005
    Messages
    7 152
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Développeur C++
    Secteur : Industrie

    Informations forums :
    Inscription : Novembre 2005
    Messages : 7 152
    Points : 22 087
    Points
    22 087
    Par défaut
    Citation Envoyé par Mabiche103
    J'ai essaie la technique de Interruption13h et pottiez mon appli tourne a fond et empeche donc tte interaction avec la fenetre ouverte!!!

    Pour plus de detail de mon calcul long:

    En faite je fais plusieurs chose a la suite, c'est des suite de boucle "while" et "for" parfois imbriqué avec des "if" dedans.

    Ce que j'ai fais c'est donc d'ouvrir ma fenetre
    et tt au long dans mes conditions de boucle j'ai rajouté des teste
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    while (test!=true)
    ...
    for (int i=0; test!=true)
    ...
    et dans ma fenetre j'ai mis un bouton et lorsqu'on clique dessus
    Mais comme je l'ai dit mon appli tourne a fond, quelqu'un aurai une idee???

    Merci.


    Mabiche103
    Insert cette ligne de code dans tes boucles :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Application->ProcessMessages() ;
    Quand une réponse vous a été utile, pensez à utiliser le nouveau système de notation

    Lisez le magazine de developpez.com.
    Mes tutos : http://pottiez.developpez.com

    La FAQ BCB -> 642 Questions/Réponses, si vous voulez participer, contactez moi. Aide de BCB6 en français

    N'oubliez pas que l'aide existe et est affichée sous simple pression de la touche F1 , une touche c'est plus rapide que tout un message .

  7. #7
    Membre éclairé
    Avatar de Interruption13h
    Inscrit en
    Août 2005
    Messages
    603
    Détails du profil
    Informations forums :
    Inscription : Août 2005
    Messages : 603
    Points : 786
    Points
    786
    Par défaut
    Salut !

    Et attention au condition de tes boucles (ex: test),parceque :


    while (test!=true)
    ...
    for (int i=0; test!=true)
    ...
    ça me semble un peu lourd ....

    a+
    Plus tu prends part aux joies et chagrins des gens, plus ils te sont proches et chers. Mais c'est le chagrin et les problèmes qui vous rapprochent le plus.

    (Mark TWAIN)

  8. #8
    Membre à l'essai
    Inscrit en
    Mai 2006
    Messages
    17
    Détails du profil
    Informations personnelles :
    Âge : 38

    Informations forums :
    Inscription : Mai 2006
    Messages : 17
    Points : 13
    Points
    13
    Par défaut
    Merci a toi Pottiez. Ca fonctionne!!!

    Pour ceux qui est des tests, c'est juste un exemple de conditions pour être plus precis j'aurai pu mettre:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    while (test!=true && "ma condition")
    ...
    for (int i=0;test!=true && "ma condition";i++)
    ...
    "Ma condition" étant la condtion d'arret durant le fonctionnement normal.

    Mais si tu trouve ça un peu lourd, je serai ravi que tu me donnes quelques indications supplementaire, ou solutions, ou meme avis à ce sujet.
    J'ai soif de savoir, lol.
    Toute remarque est bonne a prendre, ça peu que me faire progresser.

    A titre personnel, la ligne que j'ai rajouté sert a quoi? Il y a besoin de la mettre partout? De la repetter souvent?

    Merci a ts

  9. #9
    Responsable Magazine

    Avatar de pottiez
    Homme Profil pro
    Développeur C++
    Inscrit en
    Novembre 2005
    Messages
    7 152
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Développeur C++
    Secteur : Industrie

    Informations forums :
    Inscription : Novembre 2005
    Messages : 7 152
    Points : 22 087
    Points
    22 087
    Par défaut
    Citation Envoyé par Mabiche103
    A titre personnel, la ligne que j'ai rajouté sert a quoi? Il y a besoin de la mettre partout? De la repetter souvent?

    Merci a ts
    Citation Envoyé par Aide de Borland
    Appelez ProcessMessages pour permettre à l'application de traiter les messages actuellement dans la file d'attente des messages. ProcessMessages parcourt la boucle des messages Windows jusqu'à ce qu'elle soit vide, puis rend le contrôle à l'application
    Un appelle dans chaque boucle assez longue permet à l'utilisateur de l'appli un meilleur fonctionnement.
    Quand une réponse vous a été utile, pensez à utiliser le nouveau système de notation

    Lisez le magazine de developpez.com.
    Mes tutos : http://pottiez.developpez.com

    La FAQ BCB -> 642 Questions/Réponses, si vous voulez participer, contactez moi. Aide de BCB6 en français

    N'oubliez pas que l'aide existe et est affichée sous simple pression de la touche F1 , une touche c'est plus rapide que tout un message .

  10. #10
    Membre habitué Avatar de maamar1979
    Inscrit en
    Mai 2006
    Messages
    174
    Détails du profil
    Informations forums :
    Inscription : Mai 2006
    Messages : 174
    Points : 134
    Points
    134
    Par défaut
    comme indiquet par la pottiez meilleur methode est d'utiliser :

    Application->ProcessMessages() ;

    cella permet au SE de scruter la file des message recus et d'executer les code adequat.

    salut
    On fait tous les X choses nécessaires pour avoir comme résultats un Y, finalement c'est Z qu'on obtiens : c'est le destin.

  11. #11
    Membre du Club
    Profil pro
    Inscrit en
    Février 2004
    Messages
    83
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Février 2004
    Messages : 83
    Points : 55
    Points
    55
    Par défaut
    Form2->ShowModal();
    annuler=false;

    while(condition && !annuler)
    {
    //traitement long...
    }

    Form2->Close();
    Il ne faut pas mettre Form2->ShowModal mais Form2->Show()

    Sinon il va attendre que la Form2 soit fermée pour que Form1? continue

  12. #12
    Membre à l'essai
    Inscrit en
    Mai 2006
    Messages
    17
    Détails du profil
    Informations personnelles :
    Âge : 38

    Informations forums :
    Inscription : Mai 2006
    Messages : 17
    Points : 13
    Points
    13
    Par défaut
    Ok merci de l'info!!!

    Et merci a ts, je suis arrivé à faire ce que je voulais.
    Tcho

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

Discussions similaires

  1. Réponses: 6
    Dernier message: 18/06/2010, 13h19
  2. [VB5] apparition d'une fenetre pendant un temps donné
    Par NacNac dans le forum VB 6 et antérieur
    Réponses: 2
    Dernier message: 21/03/2007, 14h22
  3. Affichage d'un fichier texte dans une fenetre
    Par schwinny dans le forum Access
    Réponses: 3
    Dernier message: 11/08/2006, 08h53
  4. Réponses: 11
    Dernier message: 03/05/2006, 01h24
  5. copie d'une table Y d'une base A vers une table X d'une base
    Par moneyboss dans le forum PostgreSQL
    Réponses: 1
    Dernier message: 30/08/2005, 21h24

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