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 :

Comment arrêter une fonction sous C# Winforms


Sujet :

C#

  1. #1
    Membre à l'essai
    Homme Profil pro
    Architecte de système d'information
    Inscrit en
    Avril 2020
    Messages
    28
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Architecte de système d'information

    Informations forums :
    Inscription : Avril 2020
    Messages : 28
    Points : 21
    Points
    21
    Par défaut Comment arrêter une fonction sous C# Winforms
    Bonjour,

    Je cherche une manière simple d'arrêter un traitement en cliquant sur un bouton stop.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    private void buttonWriteFast_Click (object sender, EventArgs e)
    {
       WriteFast();
    }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    private void buttonStop_Click (object sender, EventArgs e)
    {
      //code to stop WriteFast()
    }
    En fait, en cliquant sur le bouton stop, cela dirait d'arrêter la fonction WriteFast(), puis quand je recliquerais sur le bouton Start, cela redémarrerai l'action.
    Comment faire cela sous C# ?

    Merci de votre aide.

  2. #2
    Membre à l'essai Avatar de ITExpert
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Juillet 2020
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Dordogne (Aquitaine)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Juillet 2020
    Messages : 3
    Points : 14
    Points
    14
    Par défaut
    Si je comprends bien, tu as une fonction qui tourne en arrière plan (de manière asynchrone), et une fois que tu l'as appelée, elle te met dans une boucle dont tu ne sors jamais, c'est bien ça ?
    Si c'est le cas, tu peux utiliser une propriété de contrôle qui, quand elle est mise a false, te fait sortir de la boucle. Le code ressemblerait à ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    private bool ExitWriteFast { get; set; }
     
    private void buttonWriteFast_Click (object sender, EventArgs e)
    {
       ExitWriteFast = false;
       WriteFast();
    }
     
    private void buttonStop_Click (object sender, EventArgs e)
    {
       ExitWriteFast = true;
    }
    Bien sûr, ça ne marche que si WriteFast() se trouve dans la même classe que tes boutons. Sinon, il va falloir passer par un objet.

  3. #3
    Membre à l'essai
    Homme Profil pro
    Architecte de système d'information
    Inscrit en
    Avril 2020
    Messages
    28
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Architecte de système d'information

    Informations forums :
    Inscription : Avril 2020
    Messages : 28
    Points : 21
    Points
    21
    Par défaut
    Je ne pense pas qu'un simple booléen résoudra le problème.

    Dans ton code, quand on clique sur stop, il mettra juste un booléen à true, cela n'arrêtera pas la fonction WriteFast().
    En fait, j'aimerais quand je lance un traitement avec le bouton start, que ce traitement soit arrêté quand je clique sur Stop.

  4. #4
    Expert éminent sénior

    Avatar de François DORIN
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Juillet 2016
    Messages
    2 760
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Charente Maritime (Poitou Charente)

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

    Informations forums :
    Inscription : Juillet 2016
    Messages : 2 760
    Points : 10 541
    Points
    10 541
    Billets dans le blog
    21
    Par défaut
    Je vois deux approches différentes :
    • Utilisation de CancellationToken. Mais cela nécessite de revoir un peu la méthode, en modifiant notamment sa signature et en mettant au sein du code des points de vérification pour l'annulation ;
    • Utilisation d'un Thread (pas un Task mais bien un Thread). Les Threads ont une méthode Abort pour l'arrêter.


    La première solution est plus souple et moins sujette à problème, puisqu'on contrôle quand le traitement peut s'arrêter, mais nécessite une modification du code. La seconde est plus radicale et peut mener à avoir des états un peu incohérents en fonction de la nature du traitement si on y prend pas garde.
    François DORIN
    Consultant informatique : conception, modélisation, développement (C#/.Net et SQL Server)
    Site internet | Profils Viadéo & LinkedIn
    ---------
    Page de cours : fdorin.developpez.com
    ---------
    N'oubliez pas de consulter la FAQ C# ainsi que les cours et tutoriels

  5. #5
    Membre chevronné
    Homme Profil pro
    edi
    Inscrit en
    Juin 2007
    Messages
    899
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : edi

    Informations forums :
    Inscription : Juin 2007
    Messages : 899
    Points : 1 916
    Points
    1 916
    Par défaut
    Il faudrait également savoir s'il s'agit d'un "stop" (fin complète du traitement et abandon du contexte) ou bien d'une "pause" (l'exécution du traitement est suspendue mais peut reprendre sur l'état actuel).

  6. #6
    Membre à l'essai
    Homme Profil pro
    Architecte de système d'information
    Inscrit en
    Avril 2020
    Messages
    28
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Architecte de système d'information

    Informations forums :
    Inscription : Avril 2020
    Messages : 28
    Points : 21
    Points
    21
    Par défaut
    Citation Envoyé par Noxen Voir le message
    Il faudrait également savoir s'il s'agit d'un "stop" (fin complète du traitement et abandon du contexte) ou bien d'une "pause" (l'exécution du traitement est suspendue mais peut reprendre sur l'état actuel).
    Il s'agit d'un "stop" (fin complète du traitement et abandon du contexte).

  7. #7
    Membre à l'essai Avatar de ITExpert
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Juillet 2020
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Dordogne (Aquitaine)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Juillet 2020
    Messages : 3
    Points : 14
    Points
    14
    Par défaut
    A vrai dire, c'est assez difficile de répondre sans savoir ce que fais la méthode WriteFast().
    S'il s'agit d'une simple boucle, ma méthode marche, je l'ai testé pas plus tard qu'aujourd'hui pour résoudre un problème similaire. Ca marche car la propriété ExitWriteFast est partagée par tous les membres de la classe, donc si elle est mise à jour même de l'exterieur, les changements seront pris en compte dans la méthode WriteFast() (bien sûr, ce n'est pas le cas si WriteFast() se trouve hors de la classe de ta fenêtre).
    Sinon, comme l'a dit François DORIN, utiliser un Thread peut être une bonne solution, au moins tu seras sûr d'avoir le contrôle sur le traitement, et que celui-ci se fait bien en parallèle du reste du programme.

Discussions similaires

  1. Comment utiliser une fonction qui appelle une autre fonction sous Python?
    Par Younnesblack dans le forum Général Python
    Réponses: 8
    Dernier message: 01/11/2017, 23h06
  2. [Débutant] Comment implémenter une fonction objectif argmax sous Matlab ?
    Par Abdou Ghandri dans le forum MATLAB
    Réponses: 2
    Dernier message: 26/06/2015, 10h41
  3. Réponses: 6
    Dernier message: 15/05/2011, 18h50
  4. Comment chronométrer une fonction
    Par 323 dans le forum Pascal
    Réponses: 3
    Dernier message: 19/03/2003, 20h24
  5. Comment créér une collection sous Delphi
    Par PsyKroPack dans le forum Langage
    Réponses: 6
    Dernier message: 11/02/2003, 13h20

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