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 :

Arreter l'execution d'une boucle a l'aide d'un bouton


Sujet :

MFC

  1. #1
    Membre à l'essai
    Inscrit en
    Novembre 2006
    Messages
    12
    Détails du profil
    Informations forums :
    Inscription : Novembre 2006
    Messages : 12
    Points : 10
    Points
    10
    Par défaut Arreter l'execution d'une boucle a l'aide d'un bouton
    Bonjour,

    Je programme actuellement un soft qui me permettra d'enregistrer du son, démarrer l'enregistrement en appuyant sur un bouton et l'arreter en appuyant sur un autre.

    J'utilise pour cela la bibliotheque FMOD (qui est tres complete), mais j'ai un probleme ! Je me suis basé sur un exemple qu'ils fournissent dans leur doc pour créer mon programme. Quand je clique sur le bouton Start, l'enregistrement démarre bien, mais je ne peux plus l'arreter. En effet, l'enregistrement nécessite une boucle, que l'on stoppe dans l'exemple en pressant une touche du clavier...
    Mais je me veux pas passer par une touche du clavier, plutot par un bouton sur ma GUI ou alors une fenetre qui s'ouvre et qui demande de cliquer OK lorsque l'on veut arreter le programme.

    Pour que ca soit plus compréhensible, voici le code source de l'exemple :

    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
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
     
        /*
            Write out the wav header.  As we don't know the length yet it will be 0.
        */
        WriteWavHeader(fp, sound, datalength);
     
        result = sound->getLength(&soundlength, FMOD_TIMEUNIT_PCM);
        ERRCHECK(result);
     
        /*
            Main loop.
        */
        do
        {
            static unsigned int lastrecordpos = 0;
            unsigned int recordpos = 0;
     
            if (kbhit())
            {
                key = getch();
            }
     
            system->getRecordPosition(&recordpos);
            ERRCHECK(result);
     
            if (recordpos != lastrecordpos)        
            {
                void *ptr1, *ptr2;
                int blocklength;
                unsigned int len1, len2;
     
                blocklength = (int)recordpos - (int)lastrecordpos;
                if (blocklength < 0)
                {
                    blocklength += soundlength;
                }
     
                /*
                    Lock the sound to get access to the raw data.
                */
                sound->lock(lastrecordpos * exinfo.numchannels * 2, blocklength * exinfo.numchannels * 2, &ptr1, &ptr2, &len1, &len2);   /* * exinfo.numchannels * 2 = stereo 16bit.  1 sample = 4 bytes. */
     
                /*
                    Write it to disk.
                */
                if (ptr1 && len1)
                {
                    datalength += fwrite(ptr1, 1, len1, fp);
                }
                if (ptr2 && len2)
                {
                    datalength += fwrite(ptr2, 1, len2, fp);
                }
     
                /*
                    Unlock the sound to allow FMOD to use it again.
                */
                sound->unlock(ptr1, ptr2, len1, len2);
            }
     
            lastrecordpos = recordpos;
     
            printf("%-23s. Record buffer pos = %6d : Record time = %02d:%02d\r", (timeGetTime() / 500) & 1 ? "Recording to record.wav" : "", recordpos, datalength / exinfo.defaultfrequency / exinfo.numchannels / 2 / 60, (datalength / exinfo.defaultfrequency / exinfo.numchannels / 2) % 60);
     
            system->update();
     
            Sleep(10);
     
        } while (key != 27);  <------ C'est ici que je voudrais modifier le fait de presser escape par un bouton, mais je n'y arrive pas
     
        printf("\n");
     
        /*
            Write back the wav header now that we know its length.
        */
        WriteWavHeader(fp, sound, datalength);
     
        fclose(fp);
     
        /*
            Shut down
        */
        result = sound->release();
        ERRCHECK(result);
     
        result = system->release();
        ERRCHECK(result);
     
        return 0;
    }
    Voila, j'ai noté ou était mon probleme, em espérant que vous puissiez m'aider

  2. #2
    Membre habitué
    Profil pro
    Inscrit en
    Octobre 2005
    Messages
    303
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Octobre 2005
    Messages : 303
    Points : 155
    Points
    155
    Par défaut
    Je pense que tu as différentes possibilités
    1/Soit tu tournes ton code dans un thread séparé, ton bouton stoppe le thread.
    2/ Soit tu traites les messages windows à l'intérieur de la boucle. Cela te permettra d'avoir ton boutton qui fonctionne et donc de changer l'état d'une variable qui sera testée dans ta boucle while
    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
     
    {
    ...
    MSG MsgWin;
    if(::PeekMessage(&MsgWin,NULL,0,0,PM_REMOVE))
    {
       ::TranslateMessage(&MsgWin);
       ::DispatchMessage(&MsgWin);
    }
    ...
    }while(m_bCont);
     
    ....
    OnButtonClick()
    {
     m_bCont = false;
    }

  3. #3
    Membre à l'essai
    Inscrit en
    Novembre 2006
    Messages
    12
    Détails du profil
    Informations forums :
    Inscription : Novembre 2006
    Messages : 12
    Points : 10
    Points
    10
    Par défaut
    Merci beaucoup, je vais essayer cette solution

  4. #4
    Membre à l'essai
    Inscrit en
    Novembre 2006
    Messages
    12
    Détails du profil
    Informations forums :
    Inscription : Novembre 2006
    Messages : 12
    Points : 10
    Points
    10
    Par défaut
    Ca marche PARFAITEMENT !


    Merci beaucoup, encore une nouvelle chose d'apprise grace a ce forum

  5. #5
    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
    pour la pompe a messages MFC il vaut mieux utiliser celle proposée dans la faq:
    http://c.developpez.com/faq/vc/?page...rk#PumpMessage

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

Discussions similaires

  1. arreter l'execution d'une macro
    Par benjibast dans le forum Macros et VBA Excel
    Réponses: 6
    Dernier message: 10/09/2007, 13h54
  2. Réponses: 23
    Dernier message: 05/09/2007, 11h53
  3. Réponses: 4
    Dernier message: 18/05/2007, 15h37
  4. pause dans l'execution d'une boucle...
    Par MasterOfChakhaL dans le forum Général JavaScript
    Réponses: 5
    Dernier message: 10/04/2006, 21h55
  5. Arreter l'execution d'une requete ?
    Par Olv_m dans le forum ASP
    Réponses: 2
    Dernier message: 13/10/2005, 22h57

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