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

Windows Forms Discussion :

[C#] Arrêt d'une fonction et reprise


Sujet :

Windows Forms

  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    324
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 324
    Points : 343
    Points
    343
    Par défaut [C#] Arrêt d'une fonction et reprise
    Bonjour, je souhaite arreter une fonction pendent un temps determenier et la reprendre apres ce temps, je connais la simple technique de :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    Thread.Sleep(10000); // pour faire un pause du thread en cours de 10 sec
    Mais ceci, arrete tout interaction avec la fenetre
    ainsi pas de deplacement ...
    J'ai essayer avec une boucle "presque infini" mais le resultat est le même, et enfin j'ai penser a creer un 2eme thread mais cela ne sert a rien car le processus continue apres avoir lancer le second thread
    S'il vous plait aidez moi ...
    1 || 1 = 1
    1 && 1 = 1
    1 * 1 = 1
    Bon après tout, peut-être que Van Damme avait raison :
    1 + 1 = 1 // harmonie parfaite

  2. #2
    Membre expérimenté Avatar de davcha
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    1 258
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 1 258
    Points : 1 539
    Points
    1 539
    Par défaut
    Si tu veux pouvoir contrôler le cours de l'exécution d'une méthode (mettre en pause indéfiniement, reprendre l'exécution, mettre en pause X secondes, l'abandonner, ...) sans que cela n'influence le reste de ton application, tu dois exécuter cette méthode dans un second thread.

    Voici un exemple assez basique (crée un nouveau projet winform, ajoutes 3 boutons et un label) :
    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
    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
    using System;
    using System.Windows.Forms;
    using System.Threading;
     
    namespace WindowsApplication1
    {
        public partial class Form1 : Form
        {
            Thread thread = new Thread(Worker.DoWork);
     
            private static class Worker
            {
                public static int a = 0;
                public static volatile bool shouldSleep = false;
                public static void DoWork() {
                    while (true) {
                        if (shouldSleep == true) {
                            shouldSleep = false;
                            Thread.Sleep(5000);
                        }
                        a++;
                    }
                }
            }
            public Form1() {
                InitializeComponent();
            }
     
            private void button1_Click(object sender, EventArgs e) {
                thread.Start();
            }
     
            private void button2_Click(object sender, EventArgs e) {
                Worker.shouldSleep = true;
            }
     
            private void button3_Click(object sender, EventArgs e) {
                label1.Text = Worker.a.ToString();
            }
     
            private void Form1_FormClosed(object sender, FormClosedEventArgs e) {
                thread.Abort();
            }
        }
    }

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    324
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 324
    Points : 343
    Points
    343
    Par défaut
    Merci, cela m'aide grandement, je l'avais fait mais je viens de penser a mettre mettre ma classe entiere qui s'execute dasn le thread ça m'aidera par contre j'ai tester de pouvoir modifier ma form a partir du thread secondaire et il me genere une exception comme quoi, on ne peut utiliser cette fonction a partir d'un autre thread
    Bon je met le sujet en resolu.
    Je vais me debrouiller avec cette idée c'est tres sympa
    Si j'ia un probleme avec mon thread je reouvre le sujet.
    Bon dev.
    1 || 1 = 1
    1 && 1 = 1
    1 * 1 = 1
    Bon après tout, peut-être que Van Damme avait raison :
    1 + 1 = 1 // harmonie parfaite

  4. #4
    Membre averti
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    324
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 324
    Points : 343
    Points
    343
    Par défaut
    Bon ben finalement j'ai pas resolu le probleme de l'appel au thread principal.
    Lorsque je cree mon deuxieme thread je lui donen "this" comme parametre afin d'acceder a ses attributs :/
    cela marche pour un des appels mais apres je n'y arrive pas je comprend rien : c'est a s'arracher tous les cheuveux de la tête
    en fait j'ai ma form :
    et je fait un appel a ma classe secondaire ensuite cette instance de ma seconde classe je lui fait lancer une fonction mais dans un thread secondaire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    My_Scripter = new Interpreteur(My_CDB, OffsetUWrite, OffsetIWrite,this);           //constructeur classe secondaire
    My_Scripter.REC_Script(PathFile);           // une premiere fonction d'amorce de ma classe secoonadire (aucun probleme ici)
    Thread ScripterThread = new Thread(My_Scripter.RUN_Script);           // declaration du thread
    ScripterThread.Start();           // lancement du thread (et c'est dans ma fonction RUN_Script qui est lance ici que je fais un appel a this.mafonctionpublique() qui modifie le label de ma form
    Existe t'il une astuce pour modifier sa fenetre pere a partir d'un thread apart en faisant comem ça (je m'y suis peut etre mal pris)
    1 || 1 = 1
    1 && 1 = 1
    1 * 1 = 1
    Bon après tout, peut-être que Van Damme avait raison :
    1 + 1 = 1 // harmonie parfaite

  5. #5
    Membre actif
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    238
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 238
    Points : 269
    Points
    269
    Par défaut
    En fait d'un point de vue sécurité un Thread ne peux pas modifier un contrôle qu'il n'a pas créée.
    Cependant, on peux faire une feinte afin d'authoriser un Thread à faire de telles opérations:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
     
    myThread = new Thread(new ThreadStart(monEcouteur.launch));
    myThread.Name = "ThreadEcouteur";
    CheckForIllegalCrossThreadCalls = false;
     
    myThread.Start();
    Alors attention parceque à mon avis tous les Threads de ton application pourront modifier des contrôles ne leurs appartenant pas. Mais bon à voir si ca te dérange, si oui va te remet la variable à true .
    « L’erreur est humaine, mais un vrai désastre nécessite un ordinateur »

  6. #6
    Membre averti
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    324
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 324
    Points : 343
    Points
    343
    Par défaut
    Merci bien c'est parfait j'apprend des truc dis donc
    C'est parfait sujet resolu.
    1 || 1 = 1
    1 && 1 = 1
    1 * 1 = 1
    Bon après tout, peut-être que Van Damme avait raison :
    1 + 1 = 1 // harmonie parfaite

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Démarage et arrêt d'une fonction au survol
    Par Zuthos dans le forum Général JavaScript
    Réponses: 6
    Dernier message: 21/01/2013, 21h02
  2. [XL-2007] Modification d'une range = arrêt de la fonction
    Par hydredelerne dans le forum Macros et VBA Excel
    Réponses: 11
    Dernier message: 10/02/2011, 12h44
  3. Trouver un point d'arrêt dans une fonction
    Par 65days dans le forum MATLAB
    Réponses: 6
    Dernier message: 11/08/2009, 22h21
  4. arrêt d'éxécution d'une fonction après un window.-.-.href = fontion()
    Par jamesleouf dans le forum Général JavaScript
    Réponses: 6
    Dernier message: 22/07/2008, 13h07
  5. [Turbo Pascal] Allocation et désallocation de pointeurs dans une fonction
    Par neird dans le forum Turbo Pascal
    Réponses: 13
    Dernier message: 17/11/2002, 20h14

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