Visual Studio C#使用计时器将程序按住1小时

时间:2019-05-16 03:41:13

标签: c# visual-studio-2010 timer

我是新用户,我希望添加一个计时器以使程序按住一个小时,然后继续。

这是步骤:

  1. 通过串行端口发出命令,例如高
  2. 持有一个小时
  3. 再次发出相同的命令“ high”
  4. 持有一个小时
  5. 重复直到按下按钮。

我应该如何实现计时器?因为我尝试在线搜索并找到了一些示例。 我将其包含在Form1.cs中:

static System.Timers.Timer Timer1;
void button1_Click(object sender, EventArgs e)
{
     Timer1 = new System.Timers.Timer(60*60*1000);
     Timer1.Elapsed += new ElapsedEventHandler(TimedEvent);
     Timer1.Enabled = true;
}
private void TimedEvent(Object source, ElapsedEventArgs e)
{
     serialPort1.Write("high");
}

即使该代码有助于每小时重复一次高点,但它仅在60分钟后执行TimedEvent。我需要先写入串行端口,然后执行计时器。如何修改代码以获得我想要的结果?

编辑: 我意识到此代码不起作用,因为计时器没有保持一个小时。而是将其放在form1_load中。

        private void Form1_Load(object sender, EventArgs e)
        {
            Timer1 = new System.Timers.Timer(10*1000); 
            Timer1.Elapsed += TimedEvent;
        }

对此进行了尝试(如下),但计时器不起作用

static System.Windows.Forms.Timer timer4 = new System.Windows.Forms.Timer();
void button1_Click(object sender, EventArgs e)
    {
         Writetoserialport();
         timer4.Interval = 10000; // testing on 10second interval
         timer4.Enabled = true;
    }

当我删除Writetoserialport()时,该程序将永远运行。

3 个答案:

答案 0 :(得分:0)

直接致电TimedEvent进行第一次运行:

private void Form1_Load(object sender, EventArgs e)
{
    Timer1 = new System.Timers.Timer(10*1000); 
    Timer1.Elapsed += TimedEvent;
    TimedEvent();
}

但是对于每小时发生一次的罕见情况,Windows服务可能是一个更好的选择。

答案 1 :(得分:0)

这将起作用,但是有时在您关闭程序时可能会崩溃,因为System.Timers.Timer会在ThreadPool线程上触发TimedEvent。有时可能会发生的情况是在程序关闭时,将销毁SerialPort对象,但是由于Timer仍在另一个线程上执行,它将触发TimedEvent并尝试写入serialPort,但由于它会导致程序崩溃将被处置。

您应该查看System.Windows.Forms.Timer,它用于与此类GUI线程一起使用。

// INSTEAD, TRY THIS. 

//到这里真的很晚了,忘记从复制粘贴后更改一些代码         以上,现在应该很好。

    static System.Windows.Forms.Timer timer1;
    void button1_Click(object sender, EventArgs e)
    {
             timer1 = new System.Windows.Forms.Timer(60*60*1000);
             timer1.Tick += Timer1_Tick;
             timer1.Enabled = true;
             WriteToSerialPort(); // Call method directly for writing to port.
    }

    private void timer1_Tick(object sender, EventArgs e)
    {
             WriteToSerialPort(); 
    }

    private void WriteToSerialPort()
    {
             serialPort1.Write("high"); // write to port
    }

答案 2 :(得分:0)

这是另一个示例,它使您无需使用专用方法即可写入串行端口。我希望使用专用方法,以便可以将串行端口写入计时器滴答事件之外,而不必多次写入串行端口代码。下面的代码需要放在try ... catch块中。注意:System.Windows.Forms.Timer在这里。

using System;
using System.Drawing;
using System.IO.Ports;
using System.Windows.Forms;

namespace SerialPortSample
{
    public partial class Form1 : Form
    {
        private Timer timer1 = new Timer { Interval = 1000, Enabled = false }; // initialize timer, with a one second interval and disabled
        private Button startTimerButton = new Button { Name = "startTimerButton",Text = @"Toggle Timer", Size = new Size(130, 33), Location = new Point(0, 0) };

        // This is a place holder for the SerialPort control you probably have on your Form.
        //Remove this instance of serialPort1 and use the serialPort1 control from your form.
        private SerialPort serialPort1 = new SerialPort(); 
        public Form1()
        {
            InitializeComponent();
            // add button to Form
            this.Controls.Add(startTimerButton); // add button to form1
            startTimerButton.Click += StartTimerButton_Click;
            timer1.Tick += Timer1_Tick; // attach timer tick event
        }

        private void StartTimerButton_Click(object sender, EventArgs e)
        {
            timer1.Enabled = !timer1.Enabled; // toggle timer.endabled, if false the Tick event will not be raised
                timer1.Interval = 1000; // set timer interval to 1000 so the next time it is enabled it triggers immediately.
        }

        private void Timer1_Tick(object sender, EventArgs e)
        {
            timer1.Interval = 60 * 60 * 1000; // set timer interval to 1 hour so it will not trigger for an hour 

            if (!serialPort1.IsOpen)
                serialPort1.Open(); // open serial port if not open

            serialPort1.Write("high"); // write to the serial port

            serialPort1.Close(); // close serial port
        }


    }
}