3

私はC#に少し慣れていないので、ご容赦ください!

RS232 経由で自家製の望遠鏡マウントにコードを送信するプログラムを作成しています。

現時点で私が抱えている問題は、うまくいけば非常に単純です (しかし、私にとっては非常に困難です!)

例として、ボタンがあるとします。マウスの左ボタンが押されたときにループを実行し (232 データの連続ストリームになります)、マウスの左ボタンが離されたときにループを停止する必要があります。別のコード行を実行します。

私が提供した情報が十分であり、誰かが私を助けてくれることを心から願っています (私はインターネットで答えを探しました!)

どうもありがとう。

4

3 に答える 3

3

ボタンの MouseDown イベントと MouseUp イベントにフックします。MouseDown イベントは、スレッドを生成するか、ループの実行を開始するようにスレッドに通知する必要があります。MouseUp イベントは、ループの実行を停止するようにスレッドに通知する必要があります。

このようなもの:

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
        }
    }
}
于 2012-07-21T01:36:01.407 に答える
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;
        }
    }
}
于 2012-07-26T17:12:21.107 に答える
0

方法 1: 最初に、データを送信する頻度に設定された間隔でタイマーを作成します。そして tick イベントでデータを送信します。ボタンのマウス ダウン イベントとボタンのマウス アップ イベントのイベントを作成します。マウス ダウン イベントで、タイマーを開始します。マウスアップ イベントで、タイマーを停止します。

方法 2: マウス ダウン イベントでタイマーを開始する代わりに、データ送信の連続ループを実行する新しいスレッドを開始します。マウスアップ イベントでスレッドを停止します。

于 2012-07-21T01:38:08.250 に答える