none
utilisation d un bouton pour sortir d une boucle while RRS feed

  • Question

  • Bonjour,

    J ai deja pas mal rechercher sur le net et dans les tutorial mais je n ai pas trouve de solution j ai juste lu qu on ne pouvait pas trop faire ce que je voulais faire.

    Peut etre quelqu un aura une idée.

    voilà ce que je désire faire.

    while (buton_exit->Dialogresult != :Big Smileialogresult == OK)

    // Execution d une tache avec affichage dans une dialogbox

    Mon probleme est que si je fais ca comme ca je fige ma fenetre...

    Faut il rajouter un genre de timer ???

    Merci d avance

    Damien






    jeudi 8 novembre 2007 10:46

Réponses

  •  

    D'après moi, la meilleure façon de faire ce que tu essais de faire, est d'utiliser un Background Worker, tu crée ainsi un second thread pour effectuer des tâches en arrière-plan sans gêner ton affichage. Tu utilise la méthode ReportProgress pour lancer un évènement pour signaler un évènement à ta boite de dialogue, l'évènement DoWork pour effectuer tes tâches en arrière plan.

     

    Une fois que tu vas découvrir ce petit contrôle, tu ne voudras plus t'en passer!

    jeudi 8 novembre 2007 13:13
    Modérateur
  • Tu dois simplement assigner la propriété WorkerSupportsCancellation de ton BGW à True, pour ainsi permettre celui-ci de s'annuler, sinon il génère une erreur. Même chose pour WorkerSupportsProgress pour pouvoir envoyé un état de progression.

    vendredi 9 novembre 2007 18:33
    Modérateur

Toutes les réponses

  •  

    D'après moi, la meilleure façon de faire ce que tu essais de faire, est d'utiliser un Background Worker, tu crée ainsi un second thread pour effectuer des tâches en arrière-plan sans gêner ton affichage. Tu utilise la méthode ReportProgress pour lancer un évènement pour signaler un évènement à ta boite de dialogue, l'évènement DoWork pour effectuer tes tâches en arrière plan.

     

    Une fois que tu vas découvrir ce petit contrôle, tu ne voudras plus t'en passer!

    jeudi 8 novembre 2007 13:13
    Modérateur
  • En effet ca a l air tres interessant mais j avoue avoir quelque problème à l utiliser..

    J ai modifier un peu comme j ai pu car je travaille avec vc++ .net et les exemples fournis sont en c#.

    voilà ce que j ai fait.

    rivate: System::Void backgroundWorker1_DoWork(System:Surprisebject^  sender, System::ComponentModel:Big SmileoWorkEventArgs^  e) {
       
        BackgroundWorker^ bw = dynamic_cast <BackgroundWorker^> (sender);
        int arg = (int)e->Argument;
       
        //e->Result = TimeConsumingOperation(bw,arg);je l ai oter car j en ai pas spécialement besoin
        if (bw->CancellationPending)
            e->Cancel = true;

    // La form que je désire lancé en parallele qui va faire une lecture d un controleur usb

        CyUSBDevice^ MyDevice= dynamic_cast<CyUSBDevice^> (usbDevices[0]);
        MyDevice->AltIntfc = 1;
        CyUSBEndPoint^ ept = nullptr;
        int ept8;
        test = gcnew read();
        test->Show();
       
        if (MyDevice != nullptr){
            for (int i = 0;i<MyDevice->EndPoints->Length;i++){
            ept= MyDevice->EndPointsIdea;
            //Search Ept8
            if (ept->Address.ToString("X") == "88")
                ept8 = i;
            }
        }
        test->read_buffer(MyDevice->EndPoints[ept8]);
        test->Show();

    }

    private: System::Void backgroundWorker1_RunWorkerCompleted(System:Surprisebject^  sender, System::ComponentModel::RunWorkerCompletedEventArgs^  e) {
        if (e->Cancelled)
        {
            // The user canceled the operation.
            MessageBox->Show("Operation was canceled");
        }

           
              test->stop__reading();
    }


    private: System::Void read_data_Click(System:Surprisebject^  sender, System::EventArgs^  e) {
                 this->backgroundWorker1->RunWorkerAsync(2000);
       
    }


    private: System::Void button1_Click(System:Surprisebject^  sender, System::EventArgs^  e) {
                 this->backgroundWorker1->CancelAsync();
                 

    }

    et a la compilation ca passe mais lors de l execution il me dis que j ai un probleme


    This BackgroundWorker states that it doesn't support cancellation. Modify WorkerSupportsCancellation to state that it does support cancellation.

    Merci d avance


    jeudi 8 novembre 2007 14:47
  • Tu dois simplement assigner la propriété WorkerSupportsCancellation de ton BGW à True, pour ainsi permettre celui-ci de s'annuler, sinon il génère une erreur. Même chose pour WorkerSupportsProgress pour pouvoir envoyé un état de progression.

    vendredi 9 novembre 2007 18:33
    Modérateur
  • Il y a une façon très simple de faire ça :

     

    while (true)

    {

    if(buton_exit->Dialogresult != Dialogresult.OK)

      break;

    Application.DoEvents();

    }

    vendredi 18 janvier 2008 09:19
  • Effectivement cela va fonctionner, mais appeler régulièrement le DoEvents augmente le temps de calcul de la fonction et ralenti de ce fait les performances de l'application. Je crois que l'utilisation d'un second Thread est plus efficace et maintenant qu'il y a le contrôle BackgroundWorker, il est encore plus simple de les utilisés.

    vendredi 18 janvier 2008 12:33
    Modérateur