Vous ne trouvez pas de réponse à votre problème ? Alors posez la question dans le forum. Souvenez-vous qu'il n'y a jamais de question bête, mais rester dans l'ignorance parce que l'on n'ose pas poser une question, ça c'est une erreur !

Sujet : Bouton qui stoppe une action [ Windows / Process ] (bibinutz)

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é 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


Nos sponsors

Sondage...

CalendriCode

Juillet 2009
LMMJVSD
  12345
6789101112
13141516171819
20212223242526
2728293031  

Consulter la suite du CalendriCode

Téléchargements

Logiciels à télécharger sur le même thème :

Comparez les prix Nouvelle version

Photothèque Nouveau !



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
Temps d'éxécution de la page : 0,686 sec

Google Coop CodeS-SourceS Google Coop CodeS-SourceS


Certaines images présentes sur le site (notament certains avatars) sont issues des collections IconShock, donc si vous souhaitez utiliser ces icons vous devez les acheter, ne les copiez pas et ne utilisez pas dans vos sites et applications sans les avoir commandé.