Accueil > Forum > > > > Bouton qui stoppe une action
Bouton qui stoppe une action
mercredi 3 décembre 2008 à 15:39:26 |
Bouton qui stoppe une action

bibinutz
|
Bonjour, Je suis débutant en C# et j'ai une question concernant les evenements. Pour faire simple disons qu'en appuyant sur un bouton je demarre un compteur et tant que je n'appuie pas sur un autre bouton le compteur ne s'arrete pas. Voici le code que j'ai essayé d'implémenter mais il ne marche pas. Mais c'est plus la compréhension des evenements que la fonctionnalite qui m'interesse? namespace Project1{ publicpartialclassForm1 : Form{ publicint cpt;publicbool marche;public Form1(){ InitializeComponent(); } privatevoid button1_Click(object sender, EventArgs e){ marche = true;cpt = 1; while (marche == true){ cpt = cpt+1; textBox1.Text = cpt.ToString(); } } privatevoid button2_Click(object sender, EventArgs e){ marche = false;} } Merci d'avance.
|
|
mercredi 3 décembre 2008 à 17:06:08 |
Re : Bouton qui stoppe une action

renyone
|
J'ai pas trop le temps là mais c'est un probleme classique des Winforms. Tu lances une opération (while (marche == true)) qui va bloquer le thread principal ==> ton application se freeze à mon avis. Tu dois lancer cette methode de maniere asynchrone. va voir du cote des delegate, begininvoke etc.
A+
|
|
mercredi 3 décembre 2008 à 17:13:05 |
Re : Bouton qui stoppe une action

xmox667
|
Salut, Renyone a raison c'est un problème classique Tu devrais regarder de ce coté : Application.DoEvents [Lien]http://msdn.microsoft.com/fr-fr/library/system.windows.forms.application.doevents(VS.80).aspx A+
|
|
jeudi 4 décembre 2008 à 09:31:45 |
Re : Bouton qui stoppe une action

leprov
|
eh les gars cest bien beau mais vous avez meme pas lu la question....faudrait ptetre voir a pas répondre a coté de la plaque...
Donc pour l'explication, un event, cest juste un appel a une fonction (enfin grosso modo...en fait ca peut etre un appel a plusieurs fonctions). Ce qui se passe dans ton application, cest qu'au click sur bouton1, tu lance une boucle infinie. donc le thread qui execute cet event est bloqué et ne peut rien executer d'autre. Or c'est le thread de ton ui, donc tu peux pas cliquer sur ton bouton. Pire, meme si tu pouvais cliquer, le code de button2_Click ne s'executerais pas car le thread est occupé. A partir de la, tu peux regarder les deux solutions proposées ci dessus (sachant que dans ton cas je te déconseille le DoEvents, pas vraiment fait pour ce genre de chose).
Donc pour ce que tu veux faire :
-utiliser invoke/begininvoke (cherche le tutoriel sur le site concernant les operations crossthread)
-utiliser l'objet backgroundworker (msdn)
Enfin, il y a de plus des chances que ton code ne fonctionne toujours pas (du moins en mode release) meme si tu passe le code de l'event associé au click sur le bouton 1 dans un thread.
En effet, en mode release, le compilo optimise ton code, et il est possible (j'ai pas dis que ca sera forcément le cas) qu'il remplace ton code par le pseudocode suivant :
bool var_locale = marche;
var_locale =true;
cpt = 1;
while (var_locale== true)
{
cpt = cpt+1;
textBox1.Text = cpt.ToString();
}
marche = var_locale
ceci n'est qu'un pseudo code, mais en gros l'idée du compilo c'est simplement d'éviter que tu accède a la RAM a chaque itération de la boucle, donc il fait une copie locale au processeur et n'accède a ta variable qu'une fois en début et une fois en fin de boucle. dans ce cas tu devras déclarer ta variable "marche" en tant que "volatile" (public volatile bool marche;)
|
|
jeudi 4 décembre 2008 à 09:50:23 |
Re : Bouton qui stoppe une action

bibinutz
|
Salut, j'ai essaye la methode Application.DoEvents() et elle marche execpte que pour stopper le compteur je dois cliquer "deux fois" sur le bouton stop. Le premier clique rien ne se passe (le bouton stoppe ne "s'enfonce pas" et la deuxieme fois c'est bon est ce parce que le bouton stop doit recuperer la main ??). Je vais essayer de passer par les evenements avec Invoke Begin Invoke mais je ne suis pas tres encore tres familier de cette programmation. Je mets quand meme mon ptit bout de prog qui fonctionne si ca peut eventuellement debloquer quelqu'un. using System;using System.Text;using System.Windows.Forms;namespace WindowsFormsApplication1{ publicpartialclassForm1 : Form{ publicint cpt=0;publicbool marche;public Form1(){ InitializeComponent(); } privatevoid button1_Click(object sender, EventArgs e){ marche= true;while (marche == true){ cpt = cpt + 1; textBox1.Text = cpt.ToString(); Application.DoEvents();} } privatevoid button2_Click(object sender, EventArgs e){ marche = false;} } }
|
|
jeudi 4 décembre 2008 à 16:35:11 |
Re : Bouton qui stoppe une action

bibinutz
|
Salut, J'ai vite regarde les fonctions Invoke begin et j'avoue avoir assez vite decroche. Je me suis rabattu lol sur le backgroundworker et j'ai presque le resultat souhaite. Je fais juste une magouille pour me creer une bouvle infinie. Si vous avez une idee pour remplacer le for par un while (condition). C'est la condition que je ne sais pas ecrire. En gros la condition c'est : tant que je n'ai pas appuye sur le bouton annuler. Voici le code inspire de dadamagouil ( http://www.csharpfr.com/codes/BACKGROUNDWORKER_44725.aspx) namespace test_background{ publicpartialclassForm1 : Form{ public Form1(){ InitializeComponent(); } privatevoid bgwCode_ProgressChanged(object sender, ProgressChangedEventArgs e){ Int32 nombre = (Int32)e.UserState;textBox1.Text = textBox1.Text + Environment.NewLine + nombre.ToString();} privatevoid bgwCode_DoWork(object sender, DoWorkEventArgs e){ BackgroundWorker notreworker = sender asBackgroundWorker;tache(notreworker, e); } privatevoid btn_demarrer_Click(object sender, EventArgs e){ bgwCode.RunWorkerAsync(); } privatevoid tache(BackgroundWorker worker, DoWorkEventArgs e){ int i = 0; int c = 0;
for (i=0;i<100;i++) { if (worker.CancellationPending){ e.Cancel = true;e.Result = 0;
return;} c = c + 1; worker.ReportProgress(i, c); System.Threading. Thread.Sleep(5);i = 0; } }
privatevoid btn_annuler_Click(object sender, EventArgs e) { bgwCode.CancelAsync(); } } }Merci. 
|
|
dimanche 7 décembre 2008 à 13:14:53 |
Re : Bouton qui stoppe une action

kerma26
|
Salut,
Moi à ta place j'aurais lancé le compteur dans un nouveau thread : Thread mon_nouveau_thread = new thread(new threadstart(méthode_qui_demarre_le_cpt)); mon_nouveau_thrad.start(); Ce qui va démarrer ton compteur dans un nouveau thread donc ton thread principal, ta fenêtre et tes boutons seront accessible. Donc tu déclare le Thread à la vue de toutes les méthode de ta classe et tu le démarre la ou tu veux que ton compteur se lance. Ensuite reste à stopper le nouveau thread, pour ça dans ta méthode bouton arreter : private ..... bouton_arreter() { mon_nouveau_thread.abord(); }
voila bon y'aura surement des divergences dans la synthaxe du code mais bon dans les grosses lignes cela devré marcher.
|
|
lundi 8 décembre 2008 à 08:06:55 |
Re : Bouton qui stoppe une action

bibinutz
|
Salut,
Thread mon_nouveau_thread = new thread(new threadstart(méthode_qui_demarre_le_cpt)); mon_nouveau_thrad.start();
Dans le code cidessus est ce que dans methode_qui_demarre_le_cpt je peux mettre par exemple la fonction gerant le clik du bouton demarrer ?
Merci
|
|
lundi 8 décembre 2008 à 08:52:14 |
Re : Bouton qui stoppe une action

kerma26
|
lut,
Non, enfin pas directement car dans cette situation tu doit mettre une méthode "void" donc qui ne retourne rien, donc tu devras faire un petit détour (tout petit). Donc... Tu as ta méthode gérant le click du bouton : private .... monbouton(event....) { //ici tu lance ton thread qui va lancer une autre méthode (void) monThread = new thread(new threadstart(moncompteur)); monThread.start(); } //Méthode void qui incrémente le compteur private void monCompteur() { ... ctp++ ... }
Voila j'espère que tu comprendras mon charabia ;p.
|
|
lundi 8 décembre 2008 à 10:47:41 |
Re : Bouton qui stoppe une action

bibinutz
|
Salut, J'ai compris ton petit charabia lol; cependant si je veux recuperer la valeur de cpt et l'afficher dans une textbox comment je peux faire ? J'ai essaye de definir une variable globale mais cela ne marche pas. Et si je mets le code d'affichage dans la foncion moncompteur() j'ai un probleme de multicrossing. Merci. 
|
|
Cette discussion est classée dans : bouton, action, marche, cpt, stoppe
Répondre à ce message
Sujets en rapport avec ce message
Action lors d'un show [ par hetneo ]
Bonjour,En fait je travail avec deux fenetres Form1 et Form2.Donc Form1 appel Form2 lors d'un appui sur un bouton donc Form1 est caché et Form2 s'affi
Action du bouton Recherche [ par milawadie ]
Bonjour tous le monde, J'utilise Visual studio 2005,avec connexion a une base créer par Sql Server 2005,tous marche (les boutons d'ajout,de modificat
Créer une action personnalisée dans un modèle de fusion ? [ par EmacLi ]
Bonjour à tous, Je n'arrive pas à créer une action personnalisée dans un module de fusion il me sort deux erreurs à la compilation : 1. Défaillance
ouvrir le gestionnaire des taches [ par ledragon ]
bonjour à tous, je voudrais savoir ce que je dois mettre comme code pour ouvrir le gestionnaire des taches par le biais d'un bouton en c#; faire un b
enrégistrer des données dans un Datasetune [ par Chris_M ]
Bonjour, J'aimerais savoir comment créer un bouton pour enrégistrer les données d'une fenêtre dans un Dataset avec WPF. et aussi charger les données
Declenchement d'un timer [ par RODRIGUEZMOLINE ]
Salut, Dans une application console, j'ai un objet timer de la classe System.Timers.Timer. Mon objet timer a pour role d'effectuer une action après u
[C#] Récupérer le nom d'ume image [ par Narowen ]
Bonjour, Je voudrais savoir comment récupérer le nom de l'image que j'ai attribué à un bouton. J'ai d'abord importé une image dans mon projet puis à
bouton précédent dans c sharp avec javascript [ par galanedgar ]
Bonjour, J'aimerais mettre un bouton pour reculer d'un écran... J'ai fait 2 essaies : [code=cs] <asp:Button ID
Activer un bouton avec autre form [ par Byrong ]
Bonjour Sur le form1, J'ai un bouton qui ouvre un formulaire de configuration et un autre qui permet de démarrer l'application. J'aimerais obligé l
class methode fonction bdd access [ par zargooo04 ]
Bonjours, je vx votre aidée le plus vite possible, et un grand merciiii. [code=cs]using System; using System.Data.OleDb; class program_master { s
Livres en rapport
|
Derniers Blogs
[TECHDAYS2012] OUI J'Y SERAI![TECHDAYS2012] OUI J'Y SERAI! par JeremyJeanson
Bonsoir, Certes, je l'annonce avec un peu de retard, mais je serai effectivement au Techdays demain. Comme l'an dernier, je participerai au programme ATE (Ask The Expert). Si vous avez des questions Workflow, WCF, AppFabric ou plus généralement .net, n'hé...
Cliquez pour lire la suite de l'article par JeremyJeanson TFS INTEGRATION TOOLS - SUIVI DES SYNCHRONISATIONS AVEC REPORTING SERVICESTFS INTEGRATION TOOLS - SUIVI DES SYNCHRONISATIONS AVEC REPORTING SERVICES par vfabing
Afin de s'assurer du bon fonctionnement des différentes synchronisations effectuées par les TFS Integration Tools, 2 rapports sont présents dès l'installation. Il suffit alors d'effectuer les manipulations suivantes pour pouvoir les visualiser : Loca...
Cliquez pour lire la suite de l'article par vfabing CSS CONTENT STATE SELECTORS (PERSONNAL DRAFT)CSS CONTENT STATE SELECTORS (PERSONNAL DRAFT) par FREMYCOMPANY
Bonjour à tous, Je viens de publier une proposition comprenant 5 pseudo-classes pour le CSS Working Group ayant trait à l'état de chargement d'un élément (ex: IMG,VIDEO,AUDIO,OBJECT pour l'HTML.). Si le c½ur vous en dit, vous pouvez retrouver cette p...
Cliquez pour lire la suite de l'article par FREMYCOMPANY MBA : POURQUOI FAIRE ET COMMENT LE CHOISIR ?MBA : POURQUOI FAIRE ET COMMENT LE CHOISIR ? par ROMELARD Fabrice
Formation initiale Durant la formation, le découpage classique est le suivant (je donnerai les équivalences Suisse lorsque je les connaîtrais) : Ecole primaire jusqu'au Collège : Formation générale permettant d'obtenir les méthodes...
Cliquez pour lire la suite de l'article par ROMELARD Fabrice Y'A DES ERREURS QUI PEUVENT RENDRE LE DéVELOPPEUR VIOLENTY'A DES ERREURS QUI PEUVENT RENDRE LE DéVELOPPEUR VIOLENT par Aleks
Quand on a ce genre d'erreur sans log :
Et bas on a juste envie de choper le gas de Microsoft qu'a développé ça et lui foutre des baffes de Coboye ! ...
Cliquez pour lire la suite de l'article par Aleks
Logiciels
Academy System (17.2.1.0)ACADEMY SYSTEM (17.2.1.0)Logiciel de gestion des établissements.
- élèves/étudiants (inscription, dossier, absence...)
-... Cliquez pour télécharger Academy System Easy-Planning (1.0.0.1)EASY-PLANNING (1.0.0.1)Basé sur les mêmes principes que MyPlanning, Easy-Planning permet de créer des plannings sous la ... Cliquez pour télécharger Easy-Planning COLLECTOR PLUS (3.00B)COLLECTOR PLUS (3.00B)COLLECTOR PLUS version 3.00B est un logiciel utilisant une base de données alimentée par :
- L... Cliquez pour télécharger COLLECTOR PLUS PONAMEDIA PREMIUM - HELLLOOO FLASH DEMO (V7.4)PONAMEDIA PREMIUM - HELLLOOO FLASH DEMO (V7.4)PONAMEDIA TV DEVIENS HELLLOOO FLASH
LA TV SUR VOTRE ORDINATEUR.
Toute une plateforme Multi... Cliquez pour télécharger PONAMEDIA PREMIUM - HELLLOOO FLASH DEMO LettresFaciles 2011 (8.0.0.1)LETTRESFACILES 2011 (8.0.0.1)LettresFaciles est un logiciel facilitant la création et la rédaction de lettres types.
Son inte... Cliquez pour télécharger LettresFaciles 2011
|