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 :

Détecter un appel à Control.Invoke bloquant


Sujet :

C#

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2012
    Messages
    29
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Doubs (Franche Comté)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2012
    Messages : 29
    Par défaut Détecter un appel à Control.Invoke bloquant
    Bonjour,

    j'aimerais savoir si c'est possible de détecter un appel bloquant à la méthode Control.Invoke(Delegate , params object[]).

    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
            public delegate void addMessageDelegate(string message);
     
            public void addMessage(string message)
            {
                System.Diagnostics.Debug.Assert(isClosed == false);
     
                if (message != "")
                {
                    if (myProgressDialog.InvokeRequired)
                    {
                        addMessageDelegate d = new addMessageDelegate(addMessage);
                        myProgressDialog.Invoke(d, new object[] { message }); //Est-ce possible d'accorder par exemple 2 secondes à cette méthode et déclencher une exception si ça prend plus de temps
     
                    }
                    else
                    {
                        myProgressDialog.addMessage(Utilities.getDateString(DateTime.Now, false) + " : " + message + Environment.NewLine);
                    }
                }
            }
    Merci.

  2. #2
    Membre Expert
    Avatar de GuruuMeditation
    Homme Profil pro
    .Net Architect
    Inscrit en
    Octobre 2010
    Messages
    1 705
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : Belgique

    Informations professionnelles :
    Activité : .Net Architect
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2010
    Messages : 1 705
    Par défaut
    Pas sûr que ce soit exactement ce que tu veux, mais avec l'object Task<T> tu peur lancer une tâche, puis avec Wait() tu peux attendre la fin de cette tâche avec un certain timeout.
    Si la tâche n'est toujours pas finie après ce timeout, tu peux annuler la tâche.

    Un exemple pris ici :http://stackoverflow.com/questions/4...he-task-finish

    Code C# : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    var cts = new CancellationTokenSource();
     
            var newTask = Task.Factory.StartNew(state =>
                                       {
                                          var token = (CancellationToken)state;
                                          while (!token.IsCancellationRequested)
                                          {
                                          }
                                          token.ThrowIfCancellationRequested();
                                       }, cts.Token, cts.Token);
     
     
            if (!newTask.Wait(3000, cts.Token)) cts.Cancel();

  3. #3
    Membre averti
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2012
    Messages
    29
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Doubs (Franche Comté)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2012
    Messages : 29
    Par défaut
    Merci beaucoup, c'est exactement ce que je voulais. Je test et je vous dis si ça marche.

    EDIT : j'utilise le framework 3.5 et Task n'existe pas malheureusement.

  4. #4
    Membre Expert
    Avatar de GuruuMeditation
    Homme Profil pro
    .Net Architect
    Inscrit en
    Octobre 2010
    Messages
    1 705
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : Belgique

    Informations professionnelles :
    Activité : .Net Architect
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2010
    Messages : 1 705
    Par défaut
    Alors il faudra utiliser des threads ou backgroundworker.

    Est-ce qu'il faut réellement l’annuler après 2 secondes? Ou c'est juste pour ne pas bloquer ton application trop longtemps?

  5. #5
    Membre averti
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2012
    Messages
    29
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Doubs (Franche Comté)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2012
    Messages : 29
    Par défaut
    J'ai dit 2 secondes au hasard. C'est juste que de temps en temps l'application bloque sur cette instruction et je suis obligé de tout redémarrer. Je n'ai pas trouvé le moyen de "killer" cette opération.

    En fait j'utilise Invoke car la méthode est appelé par un autre thread de celui qui a créé le Control.

  6. #6
    Membre éprouvé
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2011
    Messages
    141
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2011
    Messages : 141
    Par défaut
    C'est peut-être un peu "tricky" (et peut-être même pas correct), mais ne serait-ce pas possible d'utiliser un lock autour de ces opérations, avec un timer intégré?

    Cela permettrait de ne pas laisser la main tant que l'opération ne s'est pas terminée, et de rendre la main si elle prend plus de temps que ce que tu ne désires.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    lock (_locker)
    {
      int limit = 0;
      while (limit < 200)
       {
          // tes opérations
          limit++;
          Thread.Sleep(10);
       }
    }

Discussions similaires

  1. appel de processus bloquant et application qui gèle
    Par phoenixatareva dans le forum VB.NET
    Réponses: 2
    Dernier message: 09/08/2010, 20h33
  2. [physique 2D] caractere controller se bloquant sur le mur
    Par bachir006 dans le forum Physique
    Réponses: 3
    Dernier message: 06/11/2008, 17h22
  3. Control.Invoke() et InvokeRequired
    Par Nadd dans le forum Windows Forms
    Réponses: 3
    Dernier message: 12/07/2007, 09h47
  4. Détecter lorsque l'utilisateur sort d'un controle Image
    Par tebonb dans le forum VB 6 et antérieur
    Réponses: 5
    Dernier message: 23/12/2005, 08h53
  5. Réponses: 5
    Dernier message: 14/01/2004, 20h31

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