我是新用户,我希望添加一个计时器以使程序按住一个小时,然后继续。
这是步骤:
我应该如何实现计时器?因为我尝试在线搜索并找到了一些示例。
我将其包含在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()
时,该程序将永远运行。
答案 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
}
}
}