2012-07-21 5 views
3

Je suis un peu nouveau à C# alors s'il vous plaît ours avec moi!Souris Cliquez sur Boucles en utilisant les boutons (C#)

Je suis en train d'écrire un programme pour envoyer du code via RS232 à un support de télescope fait maison.

Les questions que j'ai en ce moment est je l'espère très simple (mais assez difficile pour moi!)

À titre d'exemple que j'ai un bouton, je veux exécuter une boucle lorsque le bouton gauche de la souris enfoncé , (qui sera un flux continu de 232 données), puis lorsque le bouton gauche de la souris est relâché, j'ai besoin de la boucle pour arrêter et pour exécuter une autre ligne de code.

J'espère sincèrement que j'ai donné l'information est assez et que quelqu'un est assez aimable pour me aider le long (j'ai cherché sur internet pour trouver des réponses, croyez-moi!)

Un grand merci. Accrocher dans les événements MouseDown et MouseUp sur le bouton

Répondre

3

L'événement MouseDown doit engendrer un thread ou un signal au thread pour commencer à exécuter la boucle. L'événement MouseUp devrait signaler au thread d'arrêter l'exécution de la boucle.

Quelque chose comme ceci:

public class InterruptibleLoop 
{ 
    private volatile bool stopLoop; 
    private Thread loopThread; 

    public void Start() { 
     // If the thread is already running, do nothing. 
     if (loopThread != null) { 
      return; 
     } 

     // Reset the "stop loop" signal. 
     stopLoop = false; 

     // Create and start the new thread. 
     loopThread = new Thread(LoopBody); 
     loopThread.Start(); 
    } 

    public void Stop() { 
     // If the thread is not running, do nothing. 
     if (loopThread == null) { 
      return; 
     } 

     // Signal to the thread that it should stop looping. 
     stopLoop = true; 

     // Wait for the thread to terminate. 
     loopThread.Join(); 

     loopThread = null; 
    } 

    private void LoopBody() { 
     while (!stopLoop) { 
      // Do your work here 
     } 
    } 
} 
+0

Cette approche semble fonctionner correctement. Et c'est assez simple. Démarrer un fil sur la souris, l'arrêter à la souris. –

+0

Je pensais à ce que le thread ne fasse que pauser la souris, mais cela complique un peu l'API puisque le thread continuerait à vivre jusqu'à ce que l'objet soit correctement disposé, ou finalisé plus tard. Comme il s'agit d'une application graphique, la création et la destruction de threads constantes ne devraient pas vraiment affecter les performances. – cdhowie

0

Méthode 1: d'abord créer une minuterie avec l'intervalle réglé sur la fréquence que vous souhaitez envoyer les données. Et envoyer les données dans l'événement tick. Créez un événement pour l'événement de souris du bouton et l'événement de la souris vers le haut des boutons. Dans l'événement de souris vers le bas, démarrez le minuteur. Dans l'événement de la souris, arrêtez la minuterie.

Méthode 2: Au lieu de démarrer une minuterie sur l'événement souris vers le bas, démarrez un nouveau thread où vous effectuez une boucle continue d'envoi de données. Arrêtez le thread sur l'événement de la souris.

+0

Merci à tous pour vos réponses aimables à l'avance :) Je vais me rendre au travail et faire un rapport :) – Macko

+0

Salut à tous, merci encore pour votre aimable aide, a décidé d'utiliser des minuteries à la fin, j'ai certains très moche comme code de l'enfer ça pourrait te faire pleurer alors s'il te plaît pardonne-moi;) Apprendre encore mon chemin mais passer un bon moment, me rappelle être un enfant à nouveau sur mon Spectrum et Amiga .. sorte de :) – Macko

0
namespace Scope_Project_Ver_2 
{ 
    public partial class Form1 : Form 
    { 
     public Form1() 
     { 
      InitializeComponent();    
      // *** Output data timer *** 
      otimer.Interval = 50; 
      // otimer.Interval = isendFreq; 
      otimer.Tick += new EventHandler(otimer_Tick); 
      // *** Input data timer *** 
      // itimer.Interval = 601;      <- to be unchecked 
      // itimer.Tick += new EventHandler(itimer_Tick); <- to be unchecked 
     } 

     public int b1,b2,b3,b4,b5; 
     public string sb1, sb2, sb3, sb4, sb5; 
     public int ivorSpeed; 
     public string svorSpeed; 
     public int ihorSpeed; 
     public string shorSpeed; 
     public int isendFreq; 


     private void sendDataB_Click(object sender, MouseEventArgs e) 
     { 
      if (sendDataCB.Checked) 
      { 
       sendDataCB.Checked = false; 
       if (otimer.Enabled) 
        otimer.Stop(); 
      } 
      else 
      { 
       sendDataCB.Checked = true; 
       if (!otimer.Enabled) 
        otimer.Start(); 
      } 
     } 


     void otimer_Tick(object sender, EventArgs e) 
     { 
      SerialPort port = new SerialPort(
      "COM1", 9600, Parity.None, 8, StopBits.One); 
      port.Open(); 
      port.Write("Q"); //       Q 
      port.Write(sb1); //       1 
      port.Write(sb2); //       2 
      // Binary stuff // Ver Speed Binary  3   
      byte[] bverbinary = new byte[1]; 
      byte verbinary = 0; 
      verbinary = Byte.Parse(svorSpeed); 
      bverbinary[0] = verbinary; 
      port.Write(bverbinary, 0, bverbinary.Length); 
      // End of Binary stuff for Ver Speed 
      // Binary stuff // Hor Speed Binary   4 
      byte[] bhorbinary = new byte[1]; 
      byte horbinary = 0; 
      horbinary = Byte.Parse(shorSpeed); 
      bhorbinary[0] = horbinary; 
      port.Write(bhorbinary, 0, bhorbinary.Length); 
      port.Write(sb5); // Movement    5 
      port.Close(); 
     } 


     private void vorSpeed_ValueChanged(object sender, EventArgs e) 
     { 
      // MessageBox.Show((this.vorSpeed.Value).ToString()); 
      this.Text = "You changed the Vertical Speed to " + vorSpeed.Value; 
      ivorSpeed = (int)vorSpeed.Value; 
      svorSpeed = ivorSpeed.ToString(); 
     } 

     private void horSpeed_ValueChanged(object sender, EventArgs e) 
     { 
      // MessageBox.Show((this.horSpeed.Value).ToString()); 
      this.Text = "You changed the Horizontal Speed to " + horSpeed.Value; 
      ihorSpeed = (int)horSpeed.Value; 
      shorSpeed = ihorSpeed.ToString(); 
     } 

     private void scopeUp_MouseDown(object sender, MouseEventArgs e) // Scope Up On 
     { 
      b1 = 2; 
      b2 = 0; 
      b5 = 1; 
      sb1 = b1.ToString(); 
      sb2 = b2.ToString(); 
      sb3 = b3.ToString(); 
      sb4 = b4.ToString(); 
      sb5 = b5.ToString(); 
     } 

     private void scopeUp_MouseUp(object sender, MouseEventArgs e) // Scope Up Off 
     { 

     } 

     private void scopeRight_MouseDown(object sender, MouseEventArgs e) 
     { 
      b1 = 1; 
      b2 = 2; 
      b5 = 1; 
      sb1 = b1.ToString(); 
      sb2 = b2.ToString(); 
      sb3 = b3.ToString(); 
      sb4 = b4.ToString(); 
      sb5 = b5.ToString(); 
     } 

     private void scopeRight_MouseUp(object sender, MouseEventArgs e) 
     { 

     } 

     private void scopeDown_MouseDown(object sender, MouseEventArgs e) 
     { 
      b1 = 2; 
      b2 = 1; 
      b5 = 1; 
      sb1 = b1.ToString(); 
      sb2 = b2.ToString(); 
      sb3 = b3.ToString(); 
      sb4 = b4.ToString(); 
      sb5 = b5.ToString(); 
     } 

     private void scopeDown_MouseUp(object sender, MouseEventArgs e) 
     { 

     } 

     private void scopeLeft_MouseDown(object sender, MouseEventArgs e) 
     { 
      b1 = 0; 
      b2 = 2; 
      b5 = 1; 
      sb1 = b1.ToString(); 
      sb2 = b2.ToString(); 
      sb3 = b3.ToString(); 
      sb4 = b4.ToString(); 
      sb5 = b5.ToString(); 
     } 

     private void scopeLeft_MouseUp(object sender, MouseEventArgs e) 
     { 

     } 

     private void scopeStop_Click(object sender, EventArgs e) 
     { 
      b1 = 0; 
      b2 = 0; 
      b5 = 0; 
      sb1 = b1.ToString(); 
      sb2 = b2.ToString(); 
      sb3 = b3.ToString(); 
      sb4 = b4.ToString(); 
      sb5 = b5.ToString(); 
     } 

     private void sendFreq_ValueChanged(object sender, EventArgs e) 
     { 
      this.Text = "You changed the send Freq to " + sendFreq.Value + " m/s"; 
      isendFreq = (int)sendFreq.Value; 
     } 
    } 
} 
Questions connexes