Effectuer un sleep dans un background worker [Résolu]

Gaedarr 50 Messages postés lundi 4 février 2013Date d'inscription 12 mars 2015 Dernière intervention - 14 mai 2013 à 09:05 - Dernière réponse : Gaedarr 50 Messages postés lundi 4 février 2013Date d'inscription 12 mars 2015 Dernière intervention
- 16 mai 2013 à 08:39
Bonjour,

Tout est dans le titre. Je recherche à utiliser le Thread.Sleep(); dans mon BGW mais le hic est qu'il m'indique toujours le message suivant :

L'exception InvalidOperationException n'a pas été gérée.
BackgroundWorker est actuellement occupé et ne peut pas exécuter plusieurs tâches simultanément.

Pour vous donner une piste, voici quelques bouts de mon code.

Le timer qui appelle le BGW :
private void tmrVentilation_Tick(object sender, EventArgs e)
        {
            #region Récupération de l'heure système

            iHeures = DateTime.Now.Hour;
            iMinutes = DateTime.Now.Minute;
            iSystemeTotal = iHeures * 3600 + iMinutes * 60;

            #endregion

            if (bHeure == false)
            {
                // Appelle le BackGroundWorker toutes les 3 minutes
                iHeuresPWM = iSystemeTotal + 180;
                bHeure = true;
            }
            else if (bHeure == true)
            {
                if (iSystemeTotal == iHeuresPWM)
                {
                    // Appel de notre BackGroundWorker
                    bgwPWM.RunWorkerAsync();
                }
            }
        }


Le BackgroundWorker_DoWork :
private void bgwPWM_DoWork(object sender, DoWorkEventArgs e)
        {
            BackgroundWorker worker = sender as BackgroundWorker;

            // Accélération durant 10 secondes
            while (iPWM < iTempsAccelDecel)
            {
                OutputAnalogChannel(1, iPWM_Accel += 20);
                Thread.Sleep(1000);
                iPWM++;
            }
            iPWM = 0;

            // Vitesse maximale durant 30 secondes
            while (iPWM < iTempsVitesseMax)
            {
                OutputAnalogChannel(1, 255);
                Thread.Sleep(1000);
                iPWM++;
            }
            iPWM = 0;

            // Décélération durant 10 secondes
            while (iPWM < iTempsAccelDecel)
            {
                OutputAnalogChannel(1, iPWM_Decel -= 20);
                iPWM++;
                Thread.Sleep(1000);
            }
            OutputAnalogChannel(1, 0);
            bHeure = false;
        }


Auriez-vous une quelconque idée ? :)


Cordialement, Gaedarr.
Afficher la suite 

Votre réponse

3 réponses

Meilleure réponse
krimog 1863 Messages postés lundi 28 novembre 2005Date d'inscription 14 février 2015 Dernière intervention - 15 mai 2013 à 15:24
3
Merci
Salut,

Ton problème ne vient pas du Thread.Sleep(), mais d'un deuxième tick de tmrVentilation, qui va appeler RunWorkerAsync sur bgwPWM alors qu'il est déjà en cours (et évidemment, si tu enlèves les Thread.Sleep(), la méthode DoWork a le temps de se finir avant le tick suivant.

Donc deux solutions (selon le but précis de ton application) :
Soit tu arrêtes ton timer au début de tmrVentilation_tick (et je pense que c'est plutôt ça qui t'intéresse), soit tu crées un nouveau BackgroundWorker à chaque tick.

Krimog : while (!(succeed = try())) ;
- Nous ne sommes pas des décodeurs ambulants. Le style SMS est prohibé. -

Merci krimog 3

Avec quelques mots c'est encore mieux Ajouter un commentaire

Codes Sources a aidé 100 internautes ce mois-ci

Commenter la réponse de krimog
yann_lo_san 1137 Messages postés lundi 17 novembre 2003Date d'inscription 23 janvier 2016 Dernière intervention - 14 mai 2013 à 21:24
0
Merci
Salut,

Y'a certainement mieux a faire (cycle du processeur, compteur de perf ect...) mais simplement,
tu peux toujours simuler une fonction qui tourne dans le vide le nombre de millisecondes donnée :
Exemple :

public static void Noop(double dMilliSec)
{
    DateTime dtDeb = DateTime.Now.AddMilliseconds(dMilliSec);

    while (DateTime.Now.CompareTo( dtDeb ) < 0)
        ;
}

// blabla
// stoppe 2 secondes 1/2
Noop(2500.0);
// continue
// stoppe 1 seconde 
Noop(1000.0);
// ect...


bye...
Commenter la réponse de yann_lo_san
Gaedarr 50 Messages postés lundi 4 février 2013Date d'inscription 12 mars 2015 Dernière intervention - 16 mai 2013 à 08:39
0
Merci
Bonjour à vous,

Tout d'abord, merci d'avoir pris un peu de temps pour me répondre :)

C'est effectivement bien un second appel du BGW qui se fait alors que le thread est déjà créé.
J'ai pu modifier un peu le code pour éviter que le BGW ne soit appelé plus d'une fois tant qu'il n'a pas terminé sa tâche. La variable booléenne était là pour ça justement, mais je l'avais mal implémentée.

Problème résolu en tous cas, merci à vous deux

Cordialement, Gaedarr.
Commenter la réponse de Gaedarr

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.