winform c# 如写一个定时开始,结束的时间代码
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了winform c# 如写一个定时开始,结束的时间代码相关的知识,希望对你有一定的参考价值。
现在我有一个 Test方法 例如: protected void Test() //执行代码
怎么写一个点击按钮判断开始,结束时间,执行间隔5分钟执行Test的方法。
说明一下:
1:点击“启用“按钮后,判断当前系统时间和设定的时间,是否在有效范围内,
2:在第一个条件满足的情况下,每隔5分钟执行方法。
3:到达结束时间,自动停止,不再执行方法。
用Thread或Timer控件,Thread:
Console.WriteLine("开始时间:" + DateTime.Now.ToString("HH:mm:ss"));
Console.WriteLine("5s後启动test()方法:");
Thread.Sleep(5000);
Console.WriteLine("结束时间:" + DateTime.Now.ToString("HH:mm:ss"));
test();
参考技术A你后面又加要求了,代码就不一样了。
这里要使用Timer和Thread线程。下面是代码:
//启动按钮
private void button1_Click(object sender, EventArgs e)
DateTime timeBegin = dateTimePicker1.Value;
DateTime timeEnd = dateTimePicker2.Value;
while(true)
DateTime now = DateTime.Now;
if (now >= timeBegin && now <= timeEnd)
timer = new Timer();
timer.Interval = 1000 * 60 * 5;
timer.Tick += new System.EventHandler(Test);
timer.Start();
break;
System.Threading.Thread.Sleep(200);//休眠200毫秒判断一次时间
//停止按钮
private void button2_Click(object sender, EventArgs e)
timer.Stop();
private void Test(object sender, EventArgs e)
DateTime timeBegin = dateTimePicker1.Value;
DateTime timeEnd = dateTimePicker2.Value;
DateTime now = DateTime.Now;
if (now >= timeBegin && now <= timeEnd)
//要做的事情
else
timer.Stop();
注意Test方法需按上面来写,原来的代码写在“要做的事情”这里。
谢谢您提供的方案,现在我想问这这个Threading启动后,怎么放在后台。窗口卡不不动了,非到有效时间。
追答奥,这样的话启动按钮里的代码,要另外写成一个线程。
追问就是启动后假死了,要怎么办?
追答就是因为程序中下面这句,使程序进程停止,产生假死情况:
System.Threading.Thread.Sleep(200);
解决办法吧启动按钮里的代码,改用一个新进程运行就好了。
C# winform 两个定时器访问同一个变量
【中文标题】C# winform 两个定时器访问同一个变量【英文标题】:C# winform Two timers access same variable 【发布时间】:2020-04-07 09:59:49 【问题描述】:我是 C# 新手,我正在做一个项目,需要两个计时器同时访问同一个变量。(一个用于读取,另一个用于写入或更新)。所以,我的问题是 我应该使用哪个定时器? Forms.Timer 或 Thread.Timer。我读过一些关于它们区别的文章。由于我想使用这些计时器来更新程序的界面(图片框中的图像),所以我认为 Forms.Timer 应该在这里使用,因为它与 GUI 的东西有关。但是,哪个计时器首先执行的顺序也很重要,所以我认为 Thread.Timer 也应该考虑。有什么办法可以将它们组合在一起吗?
更新:我正在做一个心电图项目,所以基本上我一直在接收数据,我想在表格上绘制它们。但是,由于绘制大约需要 40 毫秒,所以使用一个计时器会有延迟,但我需要实时。(例如,如果我将间隔设置为 100 毫秒,那么完成应该完成的一帧绘制需要 140 毫秒100 毫秒。这将导致每个滴答声延迟 40 毫秒。)因此,我的解决方案是在我收到数据时使用一个计时器更新数据缓冲区,并使用另一个计时器调用 Invalidate,这将重新绘制所有新数据。我应该使用 thread.timer 来更新数据并使用 form.timer 来重绘表单吗?
【问题讨论】:
你是什么意思“计时器首先执行的顺序也很重要?”您是否希望这两个计时器同时触发,并且需要按特定顺序处理事件? 您应该坚持使用 WinForms 特定的计时器。您不必通过这种方式通过锁来控制对变量的访问。 你的程序到底在做什么?听起来可能有更好的模式。 @Rufus L,您好,我刚刚编辑了我的问题,您能给我提供任何建议或更好的解决方案吗 补充@Jimi 所说的内容。让它顺利运行的诀窍是在 Paint 处理程序中进行绘图,然后仔细管理 Invalidation 区域。在传入数据到达时对其进行处理,然后仅使需要更新的区域无效。一段时间后,将调用您的 Paint 例程。只有无效的区域会被更新 【参考方案1】:两个定时器的主要区别在于Form.Timer
与Form
在同一个线程中工作,因此Tick
事件访问或更改任何GUI组件(控件等)的状态都没有问题处理程序代码。在Thread.Timer
的情况下,不能保证TimerCallback
方法是从当前线程调用的(可以,但不是必须),因此访问GUI 组件可能有点困难且不容易(必须使用@ 987654327@,喜欢这里:Accessing a form's control from a separate thread)。另一方面,在Form.Timer.Tick
处理程序中实现的任何长期和密集处理都将在与GUI 相同的线程中执行,因此会降低GUI 效率和责任感。因此,一般规则是:对于 GUI 组件的快速、短期操作,使用Form.Timer
,而对于不需要访问 GUI 组件的长期、繁重的计算,使用Thread.Timer
。当然,这是一个简化的规则——最终的决定应视具体情况而定。
【讨论】:
所以,我应该使用 thread.Timer 来更新数据缓冲区,因为它需要更多的计算,并使用 form.Timer 来重新绘制表单,对吗?还有一个问题是它们是否在同一个线程上运行? 对。关于运行线程,正如我所写:Form.Timer.Tick
事件处理程序将在 GUI 线程上工作,而 Thread.Timer.TimerCallback
主要而且通常在不同于 GUI 的线程上工作。以上是关于winform c# 如写一个定时开始,结束的时间代码的主要内容,如果未能解决你的问题,请参考以下文章
C#开发的winform程序,窗体打开的速度很慢,请高手指点。。谢了先。。。