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
Progresse Bar + Conseils marche à suivre [ par emmanuel9 ]
Bonjour à tous, En faite ce serait pour un conseil, que vous me dites ce que vous pensez de ca : J'ai un fichier que je dois ouvrir et comme la ta
Evenement "clic" sur le bouton d'une commandbar office [ par tanguy92 ]
Bonjour,Un problème qui commence à me taper sur le système.J'ai créé une commandbar avec des boutons dessus. J'ai associé à chaque bouton l'évenement
[ASP .net][C#] Problème de postback automatique sur un bouton [ par emachede ]
bonjour,je développe une application web en asp net et C#j'utilise un placeholder sur ma page d'accueildans ce placeholder, j'appelle un user control
DialogResult [ par emmanuel9 ]
Bonjour à tous, En faite quand on fait ca : Form2 f2 = new Form2(); if(f2.ShowDialog() == Dia
le state dans le DrawColumnHeader, marche pas [ par Fildomen ]
Salutavec un ownerdraw = true, je vois que le state de ma listview change pas, alors moi je veux faire un if pour colorier le columnheader selon ces s
Ca marche...qu'avec un point d'arret ! [ par zigxag ]
Bonjour !je sollicite votre aide car là je ne vois plus de solution à mon probleme...J'ai mis en place une communication client/server par socket, en
help avec C# .NET [ par emiilie ]
bonjour a tous, je fais du C#.net depuis environ 15min (oui je sais ...) et voila mon objectif : j'utilise le Microsoft Visual C# .NET et je voudrais
Organisation formulaire [ par cispo ]
Bonsoir, Au chargement d'un formulaire, j'exécute une requete SQL pour connaitre le nom des "actions" présentes dans la base de données. Pour chaque
toolbar et menu [ par kakol ]
Juste un petit probleme.J'ai un menu et une toolbar. Un des elements de mon menu correspond au bouton d'index 2 de ma toolbar, auquel est associe une
Livres en rapport
|
Derniers Blogs
TECHDAYS PARIS 2010 : CONNECTEZ VOS DONNéES à SHAREPOINT 2010 AVEC LES BUSINESS CONNECTIVITY SERVICESTECHDAYS PARIS 2010 : CONNECTEZ VOS DONNéES à SHAREPOINT 2010 AVEC LES BUSINESS CONNECTIVITY SERVICES par ROMELARD Fabrice
Animé par: Gaetan Bouveret et Julien Chomarat Business Connectivity Services (BCS) est dans SharePoint 2010 la version 2 de Business Data Catalog (BDC dans SharePoint 2007). Il s'agit de la solution permettant de visualiser des données provenan...
Cliquez pour lire la suite de l'article par ROMELARD Fabrice [DIVERS] SUIVRE VOS SéRIES PRéFéRéS SUR LA TOILE[DIVERS] SUIVRE VOS SéRIES PRéFéRéS SUR LA TOILE par orion
Comme de nombreux geek, je suis un grand amateur de série TV et je rate régulièrement des épisodes de mes séries préférés. Une solution s'offre à vous avec ce merveilleux site : Tv Gorge - www.tvgorge.com Moteur de recherche à l'appui, vous pouvez ...
Cliquez pour lire la suite de l'article par orion TECHDAYS PARIS 2010 : LA BI DANS SHAREPOINT 2010TECHDAYS PARIS 2010 : LA BI DANS SHAREPOINT 2010 par ROMELARD Fabrice
Animé par: Vincent Bellet et Baptiste Giraudier La BI dans SharePoint 2010, Les nouveaux services d'application dans SP2010 et SQL Server Reporting services 2008 R2. La BI dans SharePoint est généralisée pour tous afin de permettre à tous les coll...
Cliquez pour lire la suite de l'article par ROMELARD Fabrice TECHDAYS PARIS 2010 : PLAN DE MIGRATION VERS SHAREPOINT 2010TECHDAYS PARIS 2010 : PLAN DE MIGRATION VERS SHAREPOINT 2010 par ROMELARD Fabrice
Animé par: Arnault Nouvel et Antoine Dongois Le processus à prendre : Apprendre (découvrir la plateforme) Préparer (documenter l'historique et choisir la méthode de MAJ) Test (Test de MAJ) Implémenter (Effectuer la MAJ) Valid...
Cliquez pour lire la suite de l'article par ROMELARD Fabrice
Logiciels
DB-MAIN (9.1.0)DB-MAIN (9.1.0)DB-MAIN is a data-modeling and data-architecture tool. It is designed to help developers and anal... Cliquez pour télécharger DB-MAIN Xilisoft DPG Convertisseur (5.1.37.0120)XILISOFT DPG CONVERTISSEUR (5.1.37.0120)Xilisoft DPG Convertisseur offre aux fans de Nintendo DS une bonne solution leur permettant de dé... Cliquez pour télécharger Xilisoft DPG Convertisseur GraphicsGale (2.01.01)GRAPHICSGALE (2.01.01)GraphicsGale est un logiciel de PixelArt avec de nombreuse fonctionnalités permettant de réalisé ... Cliquez pour télécharger GraphicsGale Architecte 3D (Platinum 2010)ARCHITECTE 3D (PLATINUM 2010)Architecte 3D Platinium vous permet de concevoir facilement les plans votre future maison, de l'é... Cliquez pour télécharger Architecte 3D TeamViewer 5 (TeamViewer 5)TEAMVIEWER 5 (TEAMVIEWER 5)Dépanner un ami,expliquer une manipulation devient un jeu d'enfant.
Prise en main d'un autre ord... Cliquez pour télécharger TeamViewer 5
|