begin process at 2012 02 07 09:18:07
  Trouver un code source :
 
dans
 
Accueil > Forum > 

C#

 > 

Windows

 > 

Process

 > 

Bouton qui stoppe une action


Derniers messages déposésPoser une question dans le forum ou lancer une discussion

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

Membre Club
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.


1 2

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


Nos sponsors


Sondage...

Comparez les prix

CalendriCode

Février 2012
LMMJVSD
  12345
6789101112
13141516171819
20212223242526
272829    

Consulter la suite du CalendriCode

Photothèque

 
Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils.
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 3,775 sec (3)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales