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

VB.NET Discussion :

Stopper le backgroundworker


Sujet :

VB.NET

  1. #1
    Membre émérite

    Homme Profil pro
    Inscrit en
    Mars 2012
    Messages
    691
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Israël

    Informations forums :
    Inscription : Mars 2012
    Messages : 691
    Par défaut Stopper le backgroundworker
    Bonjour,

    J'esssaie de stopper le backgroundworker


    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
     Private Sub ToolStripButtonNew_MouseDown(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles ToolStripButtonNew.MouseDown
          backgroundWorker1.WorkerSupportsCancellation = True
            backgroundWorker1.CancelAsync()
        End Sub
     
     
     Private Sub Buttonvalid_MouseClick(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles Buttonvalid.MouseClick
     backgroundWorker1.RunWorkerAsync()
    end sub
     
    Private Sub backgroundWorker1_DoWork(ByVal sender As Object, ByVal e As System.ComponentModel.DoWorkEventArgs) Handles backgroundWorker1.DoWork
     
     If backgroundWorker1.CancellationPending Then
                e.Cancel = True
            End If
    'do something 
    end sub
    le résultat si je clique sur le toolStripButtonNew et ensuite sur le boutonvalid
    une exception à backgroundWorker1.RunWorkerAsync()
    backgroundWorker1 n'est pas libre

    merci

  2. #2
    Membre Expert
    Avatar de wallace1
    Homme Profil pro
    Administrateur systèmes
    Inscrit en
    Octobre 2008
    Messages
    1 966
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Administrateur systèmes
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Octobre 2008
    Messages : 1 966
    Billets dans le blog
    7
    Par défaut
    Bonjour shayw,

    Avant de lancer la méthode "RunWorkerAsync" il faut s'assurer que le BGW ne soit pas déjà en cours d'exécution comme ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    If not backgroundWorker1.isBusy
        backgroundWorker1.RunWorkerAsync()
    End if
    Cela devrait résoudre ton problème.


    A+

  3. #3
    Membre Expert Avatar de callo
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Février 2004
    Messages
    887
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Togo

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux
    Secteur : Service public

    Informations forums :
    Inscription : Février 2004
    Messages : 887
    Par défaut
    Bonjour shayw,

    Je ne sais pas quel impact
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     backgroundWorker1.WorkerSupportsCancellation = True
    aura sur le fonctionnnement de ton code dans l'event ToolStripButtonNew_MouseDown, mais je crois qu'il serait plus pratique de mettre ce code dans l'initialisation de ton bgw; ainsi il ne sera appelé qu'une seule fois.
    Maintenant, voici comment moi je procède pour arrêter le bgw:
    Code c# : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    private void BtnCancel_Click(object sender, EventArgs e)
    {
        // Notify the worker thread that a cancel has been requested.
        // The cancel will not actually happen until the thread in the
        // DoWork checks the BgWorker.CancellationPending flag. 
        if (_bgWorker.IsBusy)
        {
           _bgWorkerCust.CancelAsync();
        }
    }
    Désolé, c'est du c#. Essayes de jouer sur la propriété IsBusy du bgw; cela devrait résoudre ton problème.
    [Edit]grillé par wallace [/Edit]

  4. #4
    Membre émérite

    Homme Profil pro
    Inscrit en
    Mars 2012
    Messages
    691
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Israël

    Informations forums :
    Inscription : Mars 2012
    Messages : 691
    Par défaut
    Bonjour

    Je n'ai pas réussi
    J'ai bien ajouté la condition
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    If not backgroundWorker1.isBusy
            backgroundWorker1.RunWorkerAsync()
       End if
    et dans le ToolStripButtonNew_MouseDown
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    If backgroundWorker1.IsBusy Then
                backgroundWorker1.CancelAsync()
            End If
    Pour mieux comprendre j'ai un bouton nouveau et un bouton valid
    le clique sur nouveau doit stopper le bgw
    le bouton valid est enable seulement si des données ont été introduit
    et le clique active le bgw

    ce que j'essaie possible que j'ai mal expliqué après avoir stopper le bgw
    la possibllité de le réutiliser

    pour tester

    J'ai placé un breakpoint à la ligne If backgroundWorker1.IsBusy
    Je lance le prog si je clique sur ToolStripButtonNew_MouseDown
    le watch indique backgroundWorker1.IsBusy = false
    ensuite je clique sur le bouton valid qui appelle le backgroundWorker1.RunWorkerAsync()
    maintenant je clique sur ToolStripButtonNew
    le watch indique backgroundWorker1.IsBusy = true
    je continue pas à pas
    backgroundWorker1.CancelAsync()
    je verifie ensuite le backgroundWorker1.IsBusy
    bizarre c'est toujours à true

  5. #5
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Par défaut
    Le BackgroundWorker ne peut pas s'arrêter tout seul ; c'est à toi, dans le code de l'évènement DoWork, de vérifier régulièrement si CancellationPending vaut true, et d'arrêter ton traitement si c'est le cas.

  6. #6
    Membre Expert Avatar de callo
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Février 2004
    Messages
    887
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Togo

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux
    Secteur : Service public

    Informations forums :
    Inscription : Février 2004
    Messages : 887
    Par défaut
    En général j'ai la structure suivante pour mes bgw et ça fonctionne bien; essayes de voir si tu peux en tirer quelque chose:
    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
    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
    91
    BackgroundWorker _bgWorkerCust;
     
    public FrmSearchCustomer()
    {
    	InitializeComponent();
    	_bgWorkerCust = new BackgroundWorker();
    	InitBgw();
    }
     
    private void InitBgw()
    {
    	_bgWorkerCust.DoWork += BgWorkerCust_DoWork;
    	_bgWorkerCust.ProgressChanged += BgWorkerCust_ProgressChanged;
    	_bgWorkerCust.RunWorkerCompleted += BgWorkerCust_RunWorkerCompleted; 
    	_bgWorkerCust.WorkerReportsProgress = true;
    	_bgWorkerCust.WorkerSupportsCancellation = true;
    }
     
    private void BtnDemarrerBgw_Click(object sender, EventArgs e)
    {
    	// ...
    	LaunchLongProcess();
    }
     
    private void LaunchLongProcess()
    {
    	BtnDemarrerBgw.Enabled = false;
    	BtnCancel.Enabled = true;
    	string keyword = SearchTextBox.Text.Trim();
    	_bgWorkerCust.RunWorkerAsync(keyword); 
    }
     
    private void BgWorkerCust_DoWork(object sender, DoWorkEventArgs e)
    {
    	string arg = (string)e.Argument;
     
    	_bgWorkerCust.ReportProgress(...); 
    	//  ....
    	_list = BLLClients.GetCustomerByName(arg); // the lengthy operation 
     
    	//If cancel button was pressed while the execution is in progress
    	//Change the state from cancellation ---> cancel'ed
    	if (_bgWorkerCust.CancellationPending)
    	{
    		e.Cancel = true;
    		//...
    		return;
    	}
    }
     
    private void BgWorkerCust_ProgressChanged(object sender, ProgressChangedEventArgs e)
    {
    	LoadingLabel.Visible = true;
    	LoadingPictureBox.Visible = true;
    }
     
    private void BgWorkerCust_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
    {
    	LoadingLabel.Visible = false;
    	LoadingPictureBox.Visible = false;
     
    	BtnDemarrerBgw.Enabled = true;
    	BtnCancel.Enabled = false;
     
    	if (e.Cancelled)
    	{
    		MessageBox.Show("Opération de recherche annulée par l'utilisateur!");
    	}
     
    	else if (e.Error != null)
    	{
    		MessageBox.Show("Une erreur s'est produite au cours de la recherche :\n\r" + e.Error.Message);
    	}
     
    	else // opération de effectuée avec succès
    	{
    		customerListBindingSource.DataSource = new SortableBindingList<CustomerList>(_list);
    	    // ...
    	}
    }
     
    private void BtnCancel_Click(object sender, EventArgs e)
    {
    	// Notify the worker thread that a cancel has been requested.
    	// The cancel will not actually happen until the thread in the
    	// DoWork checks the BgWorkerCust.CancellationPending flag. 
    	if (_bgWorkerCust.IsBusy)
    	{
    		_bgWorkerCust.CancelAsync();
            }
    }

  7. #7
    Membre Expert
    Avatar de wallace1
    Homme Profil pro
    Administrateur systèmes
    Inscrit en
    Octobre 2008
    Messages
    1 966
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Administrateur systèmes
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Octobre 2008
    Messages : 1 966
    Billets dans le blog
    7
    Par défaut
    J'avais posté sur le forum un projet exemple qui visait à lire un gros fichier tout en affichant une barre de progression à l'aide du BackgroundWorker.
    Ce projet permettait aussi d'annuler l'opération.
    Le bouton sert à lancer et à annuler la tache.

    Voilà le projet :

    http://wallace87000.upd.fr/ReadBigFile.zip

    PS : N'oublies pas de remplacer la valeur de la variable nommée "_BigFilePath" par le chemin d'un fichier d'une assez grande capacité !


    EDIT : voilà le sujet : http://www.developpez.net/forums/d13...r/#post7569916


    A+

  8. #8
    Expert éminent Avatar de Pol63
    Homme Profil pro
    .NET / SQL SERVER
    Inscrit en
    Avril 2007
    Messages
    14 193
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : .NET / SQL SERVER

    Informations forums :
    Inscription : Avril 2007
    Messages : 14 193
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    If backgroundWorker1.CancellationPending Then
                e.Cancel = True
            End If
    'do something
    pendant le do something il faut aussi vérifier si CancellationPending est à true
    autrement dit il faut que le do something soit une boucle pour pouvoir vérifier à chaque tour
    si ton do something est "une" ligne de code longue et qu'il n'y a pas de boucle, il faut trouver le moyen de faire la même chose avec une boucle ou utiliser un thread, qui lui peut etre interrompu pas proprement

    si c'est une récupération de fichier par exemple transformer la ligne de code qui récupère tout en une boucle qui récupère par bloc de x kilo octets
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

  9. #9
    Membre émérite

    Homme Profil pro
    Inscrit en
    Mars 2012
    Messages
    691
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Israël

    Informations forums :
    Inscription : Mars 2012
    Messages : 691
    Par défaut
    En fait le problème est plus complexe la sub appellé dans l'évenement
    backgroundWorker1_DoWork le "do something" est executé par une autre class

    Il y a form1 et classx
    le code du form1
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    classmath as new classx 
    private sub initialize() 
    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
      initialize
    end sub
    Private WithEvents backgroundWorker1 As New System.ComponentModel.BackgroundWorker
    Public Sub backgroundWorker1_DoWork(ByVal sender As Object, ByVal e As System.ComponentModel.DoWorkEventArgs) Handles backgroundWorker1.DoWork
       If backgroundWorker1.CancellationPending Then
                e.Cancel = True
            End If
        classx.dosomething  
    end sub
    dans le code de la classx.dosomething
    dans la boucle principal
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    if form1.backgroundWorker1.CancellationPending then
          exit sub 
      end if
    la le problème form1 est chargé de nouveau donc le backgroundWorker1
    n'est pas le meme objet
    peut etre il faut déclarer le bgw pas dans la form1 mais dans un module ?

  10. #10
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Par défaut
    Citation Envoyé par shayw Voir le message
    la le problème form1 est chargé de nouveau donc le backgroundWorker1
    Voilà exactement le genre de trucs pour lesquels je déteste VB.NET... Ca fait plein de trucs "magiques" derrière ton dos (comme pouvoir appeler les membres d'une Form sans indiquer une instance spécifique), mais tu sais pas vraiment ce qui se passe derrière, et dès que tu n'es plus exactement dans le scénario prévu (en l'occurrence tu es sur un autre thread), ça ne marche plus... Si on ajoute à ça le fait que par défaut les composants d'une Form sont déclarés comme internal (Friend), on a tous les ingrédients pour faire des catastrophes

    Bon, fin de mon coup de gueule, je vais essayer d'être plus constructif

    Le noeud du problème, c'est que ta classe qui fait le boulot ne devrait pas manipuler Form1 ; ça crée un couplage entre les deux qui non seulement n'est pas utile, mais risque de te poser des problèmes par la suite (par exemple si tu veux utiliser cette même classe depuis une autre Form). Le plus simple, ce serait que tu passes en paramètre de la méthode DoSomething une fonction qui indique s'il faut s'arrêter ou pas :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    Public Sub DoSomething(ByVal isCancellationPending As Func(Of Boolean))
        ...
     
        if isCancellationPending() then
          exit sub 
        end if
     
        ...
    End Sub
    Et dans to DoWork, tu appelles DoSomething comme ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    classx.DoSomething(Function() backgroundWorker1.CancellationPending)
    De cette façon, tu peux tester si l'annulation a été demandée, sans pour autant avoir une dépendance vers la Form dans la classe métier

    Il y a bien sûr d'autres façons de faire, mais c'est probablement celle-là qui nécessite le moins de code...

  11. #11
    Membre Expert
    Avatar de wallace1
    Homme Profil pro
    Administrateur systèmes
    Inscrit en
    Octobre 2008
    Messages
    1 966
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Administrateur systèmes
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Octobre 2008
    Messages : 1 966
    Billets dans le blog
    7
    Par défaut
    Merci tomlev. Bon coup de gueule mais très bonne leçon. J'apprécie

  12. #12
    Expert éminent Avatar de Pol63
    Homme Profil pro
    .NET / SQL SERVER
    Inscrit en
    Avril 2007
    Messages
    14 193
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : .NET / SQL SERVER

    Informations forums :
    Inscription : Avril 2007
    Messages : 14 193
    Par défaut
    Citation Envoyé par tomlev Voir le message
    Voilà exactement le genre de trucs pour lesquels je déteste VB.NET... Ca fait plein de trucs "magiques" derrière ton dos (comme pouvoir appeler les membres d'une Form sans indiquer une instance spécifique), mais tu sais pas vraiment ce qui se passe derrière, et dès que tu n'es plus exactement dans le scénario prévu (en l'occurrence tu es sur un autre thread), ça ne marche plus ...
    un fois qu'on connait les problèmes on trouve les solutions
    de ce que j'en avais vu au début dans 80% des cas la variable magique du nom de l'instance te ressort la dernière instance créée
    pour les 20% restants ca serait peut etre la 1ère instance créée qui sait ...
    à moins que ca prenne en compte le passage du garbage collector ou la météo locale

    c'est vrai qu'ils ont bien abusé microsoft là dessus

    et le pire c'est les paramètres de compilation par défaut qui laisse écrire totalement n'importe quoi et du coup on voit des débutants arriver avec des fonctions non typées et des assignations qui le sont encore moins
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

  13. #13
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Par défaut
    Citation Envoyé par Pol63 Voir le message
    de ce que j'en avais vu au début dans 80% des cas la variable magique du nom de l'instance te ressort la dernière instance créée
    pour les 20% restants ca serait peut etre la 1ère instance créée qui sait ...
    à moins que ca prenne en compte le passage du garbage collector ou la météo locale
    C'est pas tout à fait ça en fait... J'avais un peu creusé la question il y a quelque temps, et apparemment ça crée une instance pour chaque thread (l'instance par défaut d'un thread est initialisée lors de la première utilisation par ce thread). Dans le cas de shayw, quand il fait référence à Form1 depuis le DoWork du BackgroundWorker, ce n'est pas le même thread, donc pas la même instance par défaut de Form1...

    Citation Envoyé par Pol63 Voir le message
    c'est vrai qu'ils ont bien abusé microsoft là dessus
    C'est clair... Ce concept d'instance par défaut est une énorme aberration du point de vue de la POO. Tout ça pour rendre le langage "plus facile" pour les débutants... bah on voit le résultat.

    Pour moi, VB.NET ne mérite pas sa réputation de langage "facile". Ce n'est pas plus facile que C#, par exemple... La plupart des principes sont exactement les mêmes (liés à la plateforme .NET plutôt qu'au langage lui-même) ; c'est juste moins strict, et donc c'est plus facile de faire des erreurs. Les fonctionnalités "magiques" ajoutées pour rendre le langage plus abordable peuvent facilement devenir des pièges...

  14. #14
    Membre émérite

    Homme Profil pro
    Inscrit en
    Mars 2012
    Messages
    691
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Israël

    Informations forums :
    Inscription : Mars 2012
    Messages : 691
    Par défaut
    Merci Tomlev
    ça marche

    Question les "surprises vb.net" c'est seulement en vb.net ou aussi en
    c# ou c++ ?

    Je lis msdn pour comprendre

  15. #15
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Par défaut
    Citation Envoyé par shayw Voir le message
    Question les "surprises vb.net" c'est seulement en vb.net ou aussi en
    c# ou c++ ?
    Bah ça dépend de quelles surprises tu parles, mais les trucs vraiment aberrants comme l'instance par défaut d'un Form, c'est spécifique à VB.NET

    La solution que je t'ai proposée, en revanche, est utilisable dans n'importe quel langage .NET

  16. #16
    Membre Expert
    Homme Profil pro
    Développeur .Net / Delphi
    Inscrit en
    Juillet 2002
    Messages
    738
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Eure (Haute Normandie)

    Informations professionnelles :
    Activité : Développeur .Net / Delphi
    Secteur : Finance

    Informations forums :
    Inscription : Juillet 2002
    Messages : 738
    Par défaut
    Bonjour,

    Citation Envoyé par tomlev Voir le message
    Bah ça dépend de quelles surprises tu parles, mais les trucs vraiment aberrants comme l'instance par défaut d'un Form, c'est spécifique à VB.NET
    Non, Delphi le fait aussi... Je suis d'accord c'est une aberration. Heureusement, dans Delphi, on peut supprimer le code correspondant aux créations automatiques des instances des Forms. Mais c'est vrai que quand on débute, c'est la porte ouverte à toutes les fenêtres !...

  17. #17
    Membre éclairé
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Mars 2012
    Messages
    640
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Bâtiment

    Informations forums :
    Inscription : Mars 2012
    Messages : 640
    Par défaut
    Le BackgroundWorker ne peut pas s'arrêter tout seul ; c'est à toi, dans le code de l'évènement DoWork, de vérifier régulièrement si CancellationPending vaut true, et d'arrêter ton traitement si c'est le cas.
    Bonsoir a tous,
    je rebondi sur ce post car je suis justement en train d’implémenter l'annulation dans mon programme. Hors d'après la lecture de ce post on a la possibilité d'annuler dans son propre code (j'ai mis un petit résumé du code ci-dessous) mais qu'en est t'il si on lance un processus externe (ce qui est mon cas) ?
    J'imagine qu'il faut "tuer" le processus mais je ne sais pas du tout comment. Savez vous comment on procède dans ce cas ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    ' Demande d'annulation
    If backgroundWorker1.IsBusy Then
           backgroundWorker1.CancelAsync()
    End If
     
    ' Test de la demande d'annulation et sortie de la tache en cours
    Public Sub DoSomething
    if backgroundWorker1.CancellationPending then
          exit sub 
    end if
    End Sud

  18. #18
    Expert éminent Avatar de Pol63
    Homme Profil pro
    .NET / SQL SERVER
    Inscrit en
    Avril 2007
    Messages
    14 193
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : .NET / SQL SERVER

    Informations forums :
    Inscription : Avril 2007
    Messages : 14 193
    Par défaut
    pas besoin de bgw pour lancer un processus, et pour le tuer c'est .kill
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

  19. #19
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Par défaut
    Citation Envoyé par BasicZX81 Voir le message
    J'imagine qu'il faut "tuer" le processus mais je ne sais pas du tout comment. Savez vous comment on procède dans ce cas ?
    Tu pourrais utiliser Process.Kill, mais c'est pas très propre, parce que le programme en question ne supporte pas forcément bien d'être arrêté brutalement. Une autre solution est d'utiliser Process.CloseMainWindow, si le programme a une fenêtre.

    Si le process ne peut pas être interrompu proprement, il vaut sans doute mieux ne pas donner la possibilité d'annuler...

  20. #20
    Membre éclairé
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Mars 2012
    Messages
    640
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Bâtiment

    Informations forums :
    Inscription : Mars 2012
    Messages : 640
    Par défaut
    pas besoin de bgw pour lancer un processus
    En effet j'ai réagi un peu vite. Je me suis replongé dans mon code pour savoir pourquoi j'avais fait cela. J'ai retrouvé une ligne commentée qui indique que "MonProcess.WaitForExit" bloque le thread principale tant que le processus n'est pas terminé, ce qui me figé l'affichage de la progression.
    En utilisant un backgroundworker je libère le thread qui exécute l'affichage. C'est ce que j'avais noté à l’époque et cela fonctionne, bien que je ne soit pas certain que la méthode soit très orthodoxe . (Pourtant a l'époque j'avais déjà eu connaissance de la méthode invoque mais il faut croire que je n'avais pas su faire autrement).

    EDIT: j'ai fait une confusion, la méthode invoque qui n'a rien a voir avec le gel de l'affichage.

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. Stopper plein de processus
    Par tomsoyer dans le forum Linux
    Réponses: 1
    Dernier message: 30/11/2004, 19h16
  2. Réponses: 17
    Dernier message: 19/10/2004, 09h05
  3. Stopper le port d'écoute 8081
    Par vbcasimir dans le forum Réseau
    Réponses: 2
    Dernier message: 28/09/2004, 13h37
  4. [NVidia] Démarrer ou stopper sortie Tv
    Par nico-21 dans le forum DirectX
    Réponses: 2
    Dernier message: 31/05/2004, 11h59
  5. Stopper la répétition du clavier
    Par Chris89 dans le forum Assembleur
    Réponses: 6
    Dernier message: 17/10/2003, 20h53

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