如何实现暂停继续功能,用timer吗?

seanbei 2014-06-12 04:53:59
我想实现如下功能:
三个按钮:开始、暂停、继续
点击开始后,计时(100s);
在100s内任意时刻(如35s时)点击暂停,计时停止;
点击继续,计时恢复,走完剩下的65s。

我用的一个system.timer

现在调试的时候,出现这样的问题:
一旦点击开始,其他两个按钮就不可点了。

我对线程不是很了解,难道单纯使用timer无法实现我想要的功能吗?

求前辈指教!谢谢!



...全文
2122 25 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
25 条回复
切换为时间正序
请发表友善的回复…
发表回复
L_lxc 2014-06-13
  • 打赏
  • 举报
回复
timer 不是有intervl吗? timer还有enable吗,暂停的话你就放个计时器在哪里,时间到了继续next step if(pause) { while(DateTime.now>...) { if(!pause) break; DoEvent(); } }
seanbei 2014-06-13
  • 打赏
  • 举报
回复
引用 12 楼 wpfLove 的回复:
控制过程使用一个线程,暂停、启动的按钮命令在一个线程,在运行过程中,通过命令控制某个变量,通知线程随时挂起等,或者将线程处于Sleep状态,无限循环暂停状态,等等
需要计时,怎么办?还有,timer算不算单独的一个线程?
小猪八Q 2014-06-13
  • 打赏
  • 举报
回复
控制过程使用一个线程,暂停、启动的按钮命令在一个线程,在运行过程中,通过命令控制某个变量,通知线程随时挂起等,或者将线程处于Sleep状态,无限循环暂停状态,等等
seanbei 2014-06-13
  • 打赏
  • 举报
回复
我重新说下我要实现的功能吧。 我主要用来控制一个自动设备,点开始后设备自动运行,走完一个流程一共4步,当然是自动走的。如果中途有问题,就需要暂停一下,完了后,点继续接着运行。但是不知道是哪一步被暂停了,所以我就想有没有好的办法能够随意暂停,然后又能恢复。
seanbei 2014-06-13
  • 打赏
  • 举报
回复
引用 5 楼 L_lxc 的回复:
你可以用事件的方式: ManualResetEvent pauseEvent = new ManualResetEvent(false); pauseEvent.waitone(); 线程等待... pauseEvent.set(); 线程继续 轻松实现暂停功能
这个是暂停线程吗?我现在用timer计时,暂停一会儿,再继续,有什么对应的解决方法吗?
md5e 2014-06-13
  • 打赏
  • 举报
回复
你直接拖个Timer控件出来不就好了吗?
seanbei 2014-06-13
  • 打赏
  • 举报
回复
引用 3 楼 andywangguanxi 的回复:
你不给button设置enable=false 怎么会不能点了呢? 定义一个secondsCount 变量,在timer的tick事件里面自增。暂停就timer.enable = false; 停止记得把secondsCount 清空
现在好了,但是发现思路错误,这种方式无法实现我想要的功能。
seanbei 2014-06-13
  • 打赏
  • 举报
回复
引用 2 楼 dayan13 的回复:
可以实现,但是你没发现一个按钮就可以解决了吗。当然分开也可以, 我做过一个抽奖,就是timer。
能说一下实现过程吗?
seanbei 2014-06-13
  • 打赏
  • 举报
回复
引用 1 楼 liuchaolin 的回复:
system.timer你是怎么用的和怎么设置的system.timer的单位是毫秒,1000毫秒=1秒
用的aTimer.Elapsed += new ElapsedEventHandler(OnTimedEvent); 现在可以了,但是还是没法实现我想要的功能~~
L_lxc 2014-06-13
  • 打赏
  • 举报
回复
你可以用事件的方式: ManualResetEvent pauseEvent = new ManualResetEvent(false); pauseEvent.waitone(); 线程等待... pauseEvent.set(); 线程继续 轻松实现暂停功能
yaotomo 2014-06-13
  • 打赏
  • 举报
回复
timer.enable = false;
tinydyw 2014-06-13
  • 打赏
  • 举报
回复
如果是多个步骤,每个步骤再进行计时的话,我们来分析一下过程: 1.步骤1开始; 2.点击暂停,记录经过的时间,计时器暂停; 3.点击继续,将经过的时间传入计时方法,计时器再启动; 4.重复2-3; 5.步骤1完成,计时器重置; 6.步骤2开始; 7.进行2-4; 8.步骤2完成,计时器重置; 也就是说 步骤1-步骤2是一个流程,计时器是另外一个流程; 这里提供两种方法去判断步骤1是否完成: 1.在计时器里,每倒数1次就判断是否已经是0(或步骤1是否完成).若完成,则执行步骤2; 2.单独将每个步骤写成方法,封装和该方法返回值与参数列表均相同的委托,设计一个总开关.按下总开关的时候执行步骤1对应的委托,在步骤1的回调函数里执行步骤2,以此类推..而计时器单独写一个计数类,包含开始、暂停和继续的方法,在每个步骤里去实例计数类的对象执行其方法..
tinydyw 2014-06-13
  • 打赏
  • 举报
回复
等等,刚才没看明白你说的意思...也就是说你想进行计时的不只一个步骤?
tinydyw 2014-06-13
  • 打赏
  • 举报
回复
引用 19 楼 seanbei 的回复:
[quote=引用 17 楼 tinydyw 的回复:] 简单说下思路...比如我现在窗体上有个label执行倒数.. 1.首先既然是倒数,肯定是要用到timer去执行100-1的过程... 2.然后我不太清楚如果timer的enable改成false再改回true是从头重新开始,还是继续刚才的事件..那么你需要一个变量去保存你刚才按暂停的时候倒数到了哪里... 3.跟上面一样.由于不知道改成true后是从什么时候开始,因此timer执行的内容也建议包装成一个带int参数的方法,点击再开始的时候将上面记录的数字传进去,继续timer 4.这个如果涉及到多线程..直接用timer.Invoke去执行暂停和继续的方法就可以了.当然我现在没有写代码,并不清楚是否涉及到多线程,,就我个人感觉事件和委托就足够处理了. 5.暂停建议单独写个方法,在点击暂停按钮的事件里触发暂停事件,,然后暂停事件执行暂停方法.. 那么准备工作做好之后..逻辑上是这样: 1.点击开始,timer运行 2.任意时间点击暂停,记录当前的数字,并触发暂停事件 3.点击再开始按钮.将记录的数字传入再启动方法,timer再次启动 4.2-3循环 5.结束. 差不多就是这样= =...
谢谢!说到点子上去了。 我只用了一个timer,没有涉及多线程。每个步骤都是一个方法。没有意外的话一个接一个运行。 步骤1:发送一系列命令,启动定时器 等待,结束 步骤2:发送一系列命令,启动定时器 等待,结束 ... ... 暂停和继续又分别是两个方法。 暂停:发送停止命令,停止定时器,记录已经运行的时间 继续:发送继续命令,开启定时器,运行剩余的时间 那么问题来了,继续是一个方法,剩余时间运行完后,整个流程就结束了。我的初衷是继续完剩余的时间,回到下一个步骤。 也就是说,我如果在步骤1点了停止,再继续的话,怎么才能回到步骤1呢? [/quote] 停止的方法说白了就是重置计时器了....也就是说还是调用上面的启动方法,只不过参数是传最大值,这里也就是100...
枫叶萧子 2014-06-13
  • 打赏
  • 举报
回复
类似播放器的暂停,播放,停止功能么。 private string flag = "stop"; private int j = 10; private int i = 0; private void timer1_Tick(object sender, EventArgs e) { if (i <= j) { if (flag == "hold") { textBox1.AppendText("等待命令……" + Environment.NewLine); return; } else if (flag == "stop") return; //执行命令 textBox1.AppendText(i.ToString() + Environment.NewLine); if (i == j) { timer1.Enabled = false; i = 0; }else i++; } } private void button4_Click(object sender, EventArgs e) { timer1.Enabled = true; flag = "start"; } private void button5_Click(object sender, EventArgs e) { flag = "hold"; } private void button6_Click(object sender, EventArgs e) { flag = "stop"; timer1.Enabled = false; i = 0; }
gongshunkai3 2014-06-13
  • 打赏
  • 举报
回复
全局变量 bool BoolPause = false; 暂停按钮 使 BoolPause = true; 线程中:wihle(BoolPause) { Thread.Sleep(1000); }
md5e 2014-06-13
  • 打赏
  • 举报
回复
2.然后我不太清楚如果timer的enable改成false再改回true是从头重新开始,还是继续刚才的事件..那么你需要一个变量去保存你刚才按暂停的时候倒数到了哪里... 你的计时代码肯定是要做到外边去的啊,timer是false还是true都不会重置你的计数器
seanbei 2014-06-13
  • 打赏
  • 举报
回复
引用 17 楼 tinydyw 的回复:
简单说下思路...比如我现在窗体上有个label执行倒数.. 1.首先既然是倒数,肯定是要用到timer去执行100-1的过程... 2.然后我不太清楚如果timer的enable改成false再改回true是从头重新开始,还是继续刚才的事件..那么你需要一个变量去保存你刚才按暂停的时候倒数到了哪里... 3.跟上面一样.由于不知道改成true后是从什么时候开始,因此timer执行的内容也建议包装成一个带int参数的方法,点击再开始的时候将上面记录的数字传进去,继续timer 4.这个如果涉及到多线程..直接用timer.Invoke去执行暂停和继续的方法就可以了.当然我现在没有写代码,并不清楚是否涉及到多线程,,就我个人感觉事件和委托就足够处理了. 5.暂停建议单独写个方法,在点击暂停按钮的事件里触发暂停事件,,然后暂停事件执行暂停方法.. 那么准备工作做好之后..逻辑上是这样: 1.点击开始,timer运行 2.任意时间点击暂停,记录当前的数字,并触发暂停事件 3.点击再开始按钮.将记录的数字传入再启动方法,timer再次启动 4.2-3循环 5.结束. 差不多就是这样= =...
谢谢!说到点子上去了。 我只用了一个timer,没有涉及多线程。每个步骤都是一个方法。没有意外的话一个接一个运行。 步骤1:发送一系列命令,启动定时器 等待,结束 步骤2:发送一系列命令,启动定时器 等待,结束 ... ... 暂停和继续又分别是两个方法。 暂停:发送停止命令,停止定时器,记录已经运行的时间 继续:发送继续命令,开启定时器,运行剩余的时间 那么问题来了,继续是一个方法,剩余时间运行完后,整个流程就结束了。我的初衷是继续完剩余的时间,回到下一个步骤。 也就是说,我如果在步骤1点了停止,再继续的话,怎么才能回到步骤1呢?
seanbei 2014-06-13
  • 打赏
  • 举报
回复
引用 15 楼 Z65443344 的回复:
你这个设备到底是现实中的设备,还是仅仅是你窗体中的一个动画效果? 如果仅仅是个动画,你点暂停的时候记住计数,继续的时候从这个计数开始走不就得了? 如果是控制现实中的设备,就不是计数那么简单了.因为现实中的设备不会每一次运行周期都非常精确,尤其还存在故障的情况下. 现实中的设备必须要有输入状态,告诉程序现在的状况,程序根据设备状况来执行逻辑,如果出现错误就自动停止了 而不是设备都已经停止运转了,你程序还在计数.
现实中的工控设备,我理解你的意思,其实我整个过程没这么简单,我是简化了的说。实际情况是每一步都包含了通信命令的交互。
tinydyw 2014-06-13
  • 打赏
  • 举报
回复
简单说下思路...比如我现在窗体上有个label执行倒数.. 1.首先既然是倒数,肯定是要用到timer去执行100-1的过程... 2.然后我不太清楚如果timer的enable改成false再改回true是从头重新开始,还是继续刚才的事件..那么你需要一个变量去保存你刚才按暂停的时候倒数到了哪里... 3.跟上面一样.由于不知道改成true后是从什么时候开始,因此timer执行的内容也建议包装成一个带int参数的方法,点击再开始的时候将上面记录的数字传进去,继续timer 4.这个如果涉及到多线程..直接用timer.Invoke去执行暂停和继续的方法就可以了.当然我现在没有写代码,并不清楚是否涉及到多线程,,就我个人感觉事件和委托就足够处理了. 5.暂停建议单独写个方法,在点击暂停按钮的事件里触发暂停事件,,然后暂停事件执行暂停方法.. 那么准备工作做好之后..逻辑上是这样: 1.点击开始,timer运行 2.任意时间点击暂停,记录当前的数字,并触发暂停事件 3.点击再开始按钮.将记录的数字传入再启动方法,timer再次启动 4.2-3循环 5.结束. 差不多就是这样= =...
加载更多回复(5)

111,094

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • AIGC Browser
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧