求一个时间定时器时间设置

郑兰兰--定时器习题解答_百度文库
两大类热门资源免费畅读
续费一年阅读会员,立省24元!
郑兰兰--定时器习题解答
阅读已结束,下载本文需要
想免费下载更多文档?
定制HR最喜欢的简历
下载文档到电脑,方便使用
还剩2页未读,继续阅读
定制HR最喜欢的简历
你可能喜欢救急啊!想在固定的时间段内运行某程序,用时间中断还是定时器?-专业自动化论坛-中国工控网
救急啊!想在固定的时间段内运行某程序,用时间中断还是定时器?
给TA发消息
加TA为好友
发表于: 17:00:05
目前将一天的时间分为6个时间段,。有三个时间段对应A程序,两个时间段对应B程序,一个时间段对应C程序。 想法(1)是先用SFC1读取系统时间——&然后提取出小时、分秒的时间形式(time of day)——&转换成DINT数据,将读取的时间与时间段进行比较,从而判断系统时间在哪个时间段内。判断后利用跳转语句转到A或B或C程序吗?由于ABC程序的一个功能是要固定多少分钟进行检测,这是不是要用到时间中断? 想法(2)是利用定时器,如果时间到了早上7点(假设),进入A程序,运行3h后,到10点,进入B程序,这个方法可行吗?
给TA发消息
加TA为好友 发表于: 17:02:58 1楼
我是新手给你顶顶啊114bj.org
给TA发消息
加TA为好友 发表于: 17:05:50 2楼
回复内容:对:shgxbj关于我是新手给你顶顶啊114bj.org 内容的回复:我也是菜鸟,多谢多谢~
给TA发消息
加TA为好友 发表于: 18:15:47 3楼
其实你就用时间条件,来判定哪个时间段使用哪个程序就好了,利用系统时间为条件跳转就好
给TA发消息
加TA为好友 发表于: 19:30:27 4楼
回复内容:对:liulei6926_cn关于其实你就用时间条件,来判定哪个时间段使用哪个程序就好了,利用系统时间为条件跳转就好 内容的回复:请问~就是说,如果在第一个时间段内,就跳转到A程序。由于A程序要实现一个循环检测的功能,我可不可以先确定需要循环的次数(比如3次),然后用计数器(?)来实现?
给TA发消息
加TA为好友 发表于: 21:55:21 5楼
引用 兔小喵一只 的回复内容:回复内容:对:liulei6926_cn关于其实你就用时间条件,来判定哪个时间段使用哪个程序就好了,利用系统时间为条件跳转就好 内容的回复:请问~就是说,如果在第一个时间段内,就跳转到A程序。由于A程序要实现一个循环检测的功能,我可不可以先确定需要循环的次数(比如3次),然后用计数器(?)来实现?楼主自己都没理清楚 工艺要求, 你到底是 一个时间段内执行 A程序,还是一个时间段内执行 3次A 程序?&这个就用读取时钟 ,然后判断即可啊! 方法很多种, 我觉得更重要的是 楼主先理清楚 自己想要做仕么?&
给TA发消息
加TA为好友 发表于: 09:26:07 6楼
回复内容:对:miy_gongkong关于引用 兔小喵一只 的回复内容:回复内容:对:liulei6926_cn关于其实你就用时间条件,来判定哪个时间段使用哪个程序就好了,利用系统时间为条件跳转就好 内容的回复:请问~就是说,如果在第一个时间段内,就跳转到A程序。由于A程序要实现一个循环检测的功能,我可不可以先确定需要循环的次数(比如3次),然后用计数器(?)来实现?楼主自己都没理清楚 工艺要求, 你到底是 一个时间段内执行 A程序,还是一个时间段内执行 3次A 程序?&这个就用读取时钟 ,然后判断即可啊! 方法很多种, 我觉得更重要的是 楼主先理清楚 自己想要做仕么?&内容的回复:咦,是我没解释清楚?是这样的,一天分为6个时间段,三个时间段执行A程序,但是这三个时间段是分开的。同样有2个时间段执行B程序,这两个时间段也是分开的。对于C同样。ABC三个程序的主要功能是隔某个固定时间计算一次剩余数值(比如热量)~已经读取时钟了,也判断了,问题在于下一步。我不确定下一步需不需要用到时间中断这种。程序里只有OB10可以用。(可能您对于我的提问的疑问在于 那个“3次执行”,在某个时间段内执行几次程序目前还没有确定,正在讨论中,只是我举个例子~)
给TA发消息
加TA为好友 发表于: 11:32:12 7楼
感觉你用想法(1)完全能够实现要求。至于是不是要用到时间中断? 我觉得跳转进入A/B/C中后,在A/B/C中你完全可以利用定时器来实现隔多长时间计算一次啊。
给TA发消息
加TA为好友 发表于: 12:44:46 8楼
&& & &个人感觉你的想法 1 完全能实现要求 ! 还有就是你的 A,B,C 三个程序就分几个块进行,当时间比较到达时开始跳转到相应的程序块运行!
给TA发消息
加TA为好友 发表于: 15:13:02 9楼
回复内容:对:秦君_1关于感觉你用想法(1)完全能够实现要求。至于是不是要用到时间中断? 我觉得跳转进入A/B/C中后,在A/B/C中你完全可以利用定时器来实现隔多长时间计算一次啊。内容的回复:谢谢啊~~我也觉得想法(1)可以尝试,然后我试编程 按照想法(1),判断时间后,没有用跳转。设立的ROL值,若在一个时间段内,则该Rol=1。后面用到 if 判断,如果ROL为真,则调用A程序,这样编程后编译没有错误,在A程序里的具体功能我还没编程,考虑使用定时器~~
给TA发消息
加TA为好友 发表于: 15:18:59 10楼
回复内容:对:阿水--王者之师关于&& & &个人感觉你的想法 1 完全能实现要求 ! 还有就是你的 A,B,C 三个程序就分几个块进行,当时间比较到达时开始跳转到相应的程序块运行! 内容的回复:谢谢建议~!我采用想法(1),将程序ABC分块,不过我没有采用跳转,用的调用块语句,现在编译没有错误~
周点击排行周回复排行
[14] [12] [12] [10] [10] [9] [8] [8] [7] [7]
[1] [1] [1] [1] [1] [0] [0] [0] [0] [0]最新求助
[0] [46] [6] [8] [2] [1] [13] [5] [6] [11]如何写一个定时器 输出系统时间?【c语言吧】_百度贴吧
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&签到排名:今日本吧第个签到,本吧因你更精彩,明天继续来努力!
本吧签到人数:0成为超级会员,使用一键签到本月漏签0次!成为超级会员,赠送8张补签卡连续签到:天&&累计签到:天超级会员单次开通12个月以上,赠送连续签到卡3张
关注:568,354贴子:
如何写一个定时器 输出系统时间?收藏
2 使用定时器 每秒输出一段话
三秒后停止 然后再创建定时器 输出另一段话
两秒后停止
看到这道题
不知道改如何编写
...貌似哪里有一个关于硬件高精度计数器的函数...前几天刚看见...应该有用....等上机了找一下......
能把目的说清楚点吗?什么时候输出系统时间?什么时候输出“一段话”?
第二题,我理解你的意思应该是这样吧?代码地址:
“定时器输出时间”是什么?要每一秒输出一次系统时间吗?
用alarm或者setitimer函数可以用来定时,time函数可以用来输出系统时间
可以照7楼的做法,5楼用sleep也行,不过时间不够准确,如果楼主是硬件方面的题目,可以弄个硬件定时器或者弄个软定时器
LZ没有明确说明定时精度和"一段话"的长度,所以此题无解.
登录百度帐号推荐应用定时器与系统时间 - 李星星 - 博客园
问题:--------------------------------------------------------------------------------用户反馈一些定时活动提前开启或者延后开启1) 登录服务器,查看时间确实慢了或者快了。总之是有几台服务器时间不准确了。2) 查看代码是使用的ScheduledExecutorService.scheduleAtFixedRate,Java的API,不至于这里存在Bug3) 查看log4j日志输出发现:& & 12点的定时活动,之前的[活动运行时间]就是12点整;后面有几天的[活动运行时间]是12点零几分,而且分秒都一致& & 确认了一下,变化之间同步了一下服务器时间,但是没有重启jvm4) 初步怀疑是ScheduledExecutorService内部执行使用的是相对时间,不是每次采样服务器系统时间
问题确认-测试:--------------------------------------------------------------------------------5) 测试
ScheduledExecutorService service = Executors.newScheduledThreadPool(2);
service.scheduleAtFixedRate(new Runnable() { // Runnable-1
& &&public void run() {
& &&& &&System.out.println( String.format("\n#### %s ####",
& &&& &&& &&& &&new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.S").format(new Date())));
}, 0, 10, TimeUnit.SECONDS); // 10秒执行一次
service.scheduleAtFixedRate(new Runnable() { // Runnable-2
& &&int i = 0;
& &&@Override
& &&public void run() {
& &&& &&System.out.print( (i++) + "," );
}, 0, 1, TimeUnit.SECONDS);
// 1秒执行一次
16:51:48.118 ####
& &&1,2,3,4,5,6,7,8,9,
16:51:58.93 ####
& &&10,11,12,13,14,15,16,17,18,19,20,
16:52:08.94 ####
& &&21,22,23,24,25,26,27,28,29,
16:52:18.93 ####
& &&30,31,32,33,34,35,36,37,38,39,
16:52:28.93 ####
& &&40,41,42,43,44,45,46,47,48,49,
16:58:36.480 ####
// 调整时间
& &&50,51,52,53,54,55,56,57,58,59,
16:58:46.480 ####
& &&60,61,62,63,64,65,66,67,68,69,
16:58:56.480 ####
在 16:52:28.93 时调整时间为16:58:36.480(向后跳), Runnable-2依然进行了10次输出,然后Runnable-1输出1次
17:12:40.971 ####
& &&1,2,3,4,5,6,7,8,9,
17:12:50.943 ####
& &&10,11,12,13,14,15,16,17,18,19,
17:13:00.943 ####
// 调整时间
& &&20,21,22,23,24,25,26,27,28,29,
17:05:09.69 ####
& &&30,31,32,33,34,35,36,37,38,39,
17:05:19.68 ####
在 17:13:00.943 时调整时间为17:05:09.69(向前跳), Runnable-2依然进行了10次输出,然后Runnable-1输出1次
测试结论: 时间的跳跃不影响 Runnable-1 10个秒单位输出一次, ScheduledExecutorService 没有使用系统时间
问题确认-JDK源码:--------------------------------------------------------------------------------
ScheduledExecutorService service = Executors.newScheduledThreadPool(2);
new ScheduledThreadPoolExecutor(corePoolSize)
super(corePoolSize, Integer.MAX_VALUE, 0, TimeUnit.NANOSECONDS, new DelayedWorkQueue())
注册定时任务
service.scheduleAtFixedRate(new Runnable() {...})
RunnableScheduledFuture&?& t = decorateTask(command, new ScheduledFutureTask&Object&(command, null,
triggerTime(initialDelay, unit), unit.toNanos(period)));
// ScheduledThreadPoolExecutor.ScheduledFutureTask
delayedExecute(t);
prestartCoreThread
addIfUnderCorePoolSize
Worker w = new Worker(firstTask);
// ThreadPoolExecutor.Worker
Thread t = threadFactory.newThread(w);
workers.add(w);
super.getQueue().add(command);
// DelayedWorkQueue
ThreadPoolExecutor.Worker.run
task = getTask()
r = workQueue.take();
// DelayedWorkQueue
ScheduledThreadPoolExecutor.DelayedWorkQueue.take
dq.take();
// DelayQueue&RunnableScheduledFuture&
DelayQueue&E extends Delayed&
Delayed 元素的一个无界阻塞队列,只有在延迟期满时才能从中提取元素。
该队列的头部 是延迟期满后保存时间最长的 Delayed 元素。
如果延迟都还没有期满,则队列没有头部,并且 poll 将返回 null。
当一个元素的 getDelay(TimeUnit.NANOSECONDS) 方法返回一个小于等于 0 的值时,将发生到期。
即使无法使用 take 或 poll 移除未到期的元素,也不会将这些元素作为正常元素对待。
例如,size 方法同时返回到期和未到期元素的计数。此队列不允许使用 null 元素。
long delay =
first.getDelay(TimeUnit.NANOSECONDS);
if (delay & 0) {
long tl = available.awaitNanos(delay);
ScheduledThreadPoolExecutor.ScheduledFutureTask.getDelay
public long getDelay(TimeUnit unit) {
return unit.convert(time - now(), TimeUnit.NANOSECONDS);
final long now() {
* public static long nanoTime()
* 返回最准确的可用系统计时器的当前值,以毫微秒为单位。
* 此方法只能用于测量已过的时间,与系统或钟表时间的其他任何时间概念无关。
* 返回值表示从某一固定但任意的时间算起的毫微秒数(或许从以后算起,所以该值可能为负)。
return System.nanoTime() - NANO_ORIGIN;
问题确认-nanoTime测试:--------------------------------------------------------------------------------
new Thread(){
public void run () {
long lastNanos = System.nanoTime();
long lastMilis = System.currentTimeMillis();
for (int i = 0; i & 100; i++) {
try { Thread.sleep(10000L); } catch (InterruptedException e) { } // 10秒钟输出一次
long nanos = System.nanoTime();
long millis = System.currentTimeMillis();
System.out.println( String.format("%-25s %-10s %s-%s = %s [%s]",
new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.S").format(new Date(millis)),
millis - lastMilis,
nanos, lastNanos,
nanos - lastNanos, (nanos - lastNanos) / 1000 / 1000
lastNanos =
lastMilis =
}.start();
& && 10:10:45.950 & 10001 & & & &944-958 =
& && 10:10:55.997 & 10047 & & & &723-944 =
& && 10:20:04.198 & 548201 & & &057-723 =
& && 10:00:12.399 & -1191799 & 855-057 =
& && 10:00:22.399 & 10000 & & & &208-855 =
& &&在 10:10:55.997 时调整时间为10:20:04.198(向后跳), 在 10:20:04.198 时调整时间为10:00:12.399(向前跳),
nanos - lastNanos总是维持在 10s左右, millis - lastMilis 确实期望中的时间
想法与目标:--------------------------------------------------------------------------------7) 我想做一个定时器,依赖于当前系统时间的定时器;顺便解决当前问题& & a) 它不是定时任务,不是一个任务系统。& & b) 它只做一件事情,到时间了提醒我做某个任务。& & 比如,12点了,提醒我该吃叫花鸡了;20点了,该打帮会战了。
初步设计:--------------------------------------------------------------------------------
8) 初步设计& & a) 首先创建一个任务线程池,用于执行定时器叫醒的任务。& & & & Executors.newScheduledThreadPool(workServicePoolSize)
& &&b) 创建一个定时器线程, 每隔1秒执行一次handleFunc(心跳步长1秒)
& &&& &&Executors.newSingleThreadScheduledExecutor
& &&c) handleFunc根据当前系统时间查找到时的任务,把任务放置到任务线程池,由任务线程池执行
& &&& &&execute(new Runnable(){});
& &&可以初步解决任务依赖系统时间来执行问题
详细设计:--------------------------------------------------------------------------------
9) Linux系统时间会变快或者变慢,比如23点战力排行榜截止并在30分钟后开始领取奖励
& &&a) 如果快的太多;大家当前都是22:55,但是服务器已经23:00,想等着最后冲榜的兄弟立马就哭了
& &&b) 如果慢的太多;大家当前都是23:00,但是服务器才是22:55,我都休息了,准备开始领取奖励,你还能冲击战力榜
& &&a) handleFunc每次执行后,记录一下当前执行时间为 lastExecuteTime
& &&b) handleFunc下次执行的时候,拿 executeTime(当前时间) 和 lastExecuteTime比较一下
& &&& &&如果 executeTime == lastExecuteTime + 1: (心跳步长1秒)
& &&& &&& &&正常时间,正常执行
& &&& &&如果 executeTime &
lastExecuteTime + 1:
& &&& &&& &&时间快了(通常是服务器时间慢了;校正服务器时间,服务器时间会快进), 需要处理一下:
& &&& &&& &&& &&[lastExecuteTime + 1, executeTime - 1]的任务 根据业务决定是否需要立马补执行
& &&& &&& && &&&[executeTime]的任务 是当前时间正常任务,需要正常执行
& &&& &&如果 executeTime &= lastExecuteTime:
& &&& &&& &&时间慢了(通常是服务器时间快了;校正服务器时间,服务器时间会回退):
& &&& &&& &&& &&[executeTime, lastExecuteTime] 都执行过了,一般不需要再执行了
& &&注1:当前时间和lastExecuteTime都是抹去毫秒的,日常定时服务基于秒来计算足够了
& &&注2: 服务器可以每隔1个小时同步一次时间,比方 NN:38,通常要避开整点、半点、整十分
& &&注3: 每小时同步一次最多误差几秒而已,对于普通业务而言:
& &&& &&时间快了的情况下,立马补执行一下就可以了,比较重要的奖励提前或者延迟5秒发没有多少差别
& &&& &&时间慢了的情况下,可以忽视掉[executeTime, lastExecuteTime]间的任务,不需要再执行一次了
& &&注4: 执行时间粒度比较小的,比方说1秒执行一次的,可以无视时间跳跃的问题
详细设计-定时任务:--------------------------------------------------------------------------------
10) 这样用定时器的方案,可以解决时间跳跃的问题;但是日常开发通常是定时周期任务
& &&比如, 12点吃叫花鸡,12点定时器通知吃叫花鸡;但是吃叫花鸡是每天12点都吃,这就是个定时周期任务,需要每天12点都
& &&通知一下吃。处理方案可以如下:
& &&a) 修改&handleFunc根据当前系统时间查找到时的任务&
& &&b) 查找的任务仓库分为两类仓库:
& &&& &&一次性任务仓库:
& &&& &&& &&到时间就执行任务,并移除; 任务仓库的存储的key是任务执行时间戳
& &&& &&每日的任务仓库:
& &&& &&& &&任务仓库的存储的key是,任务相对于凌晨00:00:00的秒数
& &&& &&& &&handleFunc执行时候,查看一下,今天过去了多少秒(这个是使用系统时间),找到对应任务,然后执行。这个不需要移除任务
& &&这样依然是定时器的概念,&12点到时间了,我叫你去吃叫花鸡;明天12点到时间了,我再叫你去吃叫花鸡&,
& &&而不是&12点了,我叫你去吃叫花鸡;24小时后我再叫你去吃鸡&。
& &&注1: 同理可以增加每周、每小时、每分钟的任务仓库
& &&注2: 通常不需要每月、每年、每十年等周期任务,如果需要加也很简单
& &&注3: 每秒的,不需要这么多少事情, handleFunc 过了就直接执行(每次时间间隔是利用nano计算出来的1秒,所以应该执行)
接口设计:--------------------------------------------------------------------------------
11) 对外接口:
& &&a) 启动
& &&b) 关闭
& &&c) 注册一次性任务
& &&d) 注册每周任务
& &&e) 注册每日任务
& &&f) 注册每时任务:每个小时的第几分、第几秒执行的什么任务
& &&g) 注册每分任务
& &&h) 注册每秒任务
其它说明:--------------------------------------------------------------------------------
& &&a) handleFunc 只是找到任务把它扔进工作线程池执行,不怎么占用CPU,不会造成任务选取的堵塞
& &&b) handleFunc 每次都会去 分钟的任务仓库查找合适的任务并执行;同一任务上一分钟没执行玩,当前任务也会继续执行,不会延迟,会同时执行
& &&& &&既然是每分钟任务,任务不应该超过1分钟;如果偶尔会超过1分钟,可以在注册的任务里面自行加锁
& &&c) 服务器时间慢了;校正服务器时间,服务器时间会快进,补执行任务只补处理一定时间(比如30分钟)
& &&& &&系统时间是1小时同步一次,误差最大不过几秒;如果再大,就应该升级内核或者换服务器了
& &&& &&补执行的时间段过程,可能会影响正常服务(正常服务进程、系统资源占用等等)
& &&d) 任务扔到线程池里面时候,会额外catch住,防止挂掉当前线程要求有2个功能
1.定时器
可以设定某个时间,比如说11:25:30 (小时:分:秒)
到了这个时间响音乐,要有个动态提示剩余多少小时
:分:秒,并且可以设置响音乐多长时间.
2.倒计时
可以设定某个时间,比如说11:25:30 (小时:分:秒)
过了11小时25
要求有2个功能
1.定时器
可以设定某个时间,比如说11:25:30 (小时:分:秒)
到了这个时间响音乐,要有个动态提示剩余多少小时
:分:秒,并且可以设置响音乐多长时间.
2.倒计时
可以设定某个时间,比如说11:25:30 (小时:分:秒)
过了11小时25分30秒后响音乐,也要有个动态提示剩余多少小时:分:秒,并且可以设置响音乐多长时间.
Opt相关信息n Explicit
Dim Time1 As Date '当前时间
Dim Time2 As Date '定时时间
Pivate Su Fom_Load()
Time2 = "8:09:31"
'设置定时的时间,24小时制
Time1.Inteval = 1000
'设置计时器每秒钟运行一次
Time1.Enaled = Tue
'计时器开始运行
End Su
Pivate Su Time1_Time()
Time1 = Time()
'获取当前时间
If Time1
Time2 Then Exit Su '如果没有到定时时间,退出
Time1.Enaled = False
'计时器停止运行
'这下面写你要执行的代码。例如:
MsgBox "到点了!"
End Su
窗体上添加一个lael控件,一个Time控件(表的形状)
TIMER控件的INTERVAL设置成1000
Pivate Su Time1_Time()
Opt相关信息n Explicit
Dim Time1 As Date '当前时间
Dim Time2 As Date '定时时间
Pivate Su Fom_Load()
Time2 = "8:09:31"
'设置定时的时间,24小时制
Time1.Inteval = 1000
'设置计时器每秒钟运行一次
Time1.Enaled = Tue
'计时器开始运行
End Su
Pivate Su Time1_Time()
Time1 = Time()
'获取当前时间
If Time1
Time2 Then Exit Su '如果没有到定时时间,退出
Time1.Enaled = False
'计时器停止运行
'这下面写你要执行的代码。例如:
MsgBox "到点了!"
End Su
窗体上添加一个lael控件,一个Time控件(表的形状)
TIMER控件的INTERVAL设置成1000
Pivate Su Time1_Time()
Lael1.Caption = Fomat(Now, " ")
If Lael1.Caption = "09.00" Then
MsgBox "下课了"
这段程序可以提示“下课了”一分钟。直到时间到了9.01才停止
首先得用鼠标选中定时器
然后右下角的属性窗口里面有个属性叫Interval
设置为1000
希望能帮助你。
记得给分 哈哈
告诉你最高效 最简单的
For i = 1 To 1000
Text1.Text = i
1、我们的日期等等都有对应地址您可以编写一个简单脚本具体地址可以在我们的说明文档中找到
2、做10个按钮对应10个画面即可。或者您可以参考下位状态显示这个模式
如果是一阶隐函数可以把y看做f(x) 求的时候可以对x求导还可以用最简单方法先把x
看做常数对y求导然后把y看做常数对x求导如F(x,y)=0求导时,f'= -...
不是不能拆,而是拆开了之后不好装,关键是里面的发条太难装了。
如果你能把发条装好,剩下的不算是什么难题。
答: 需要你手机与电脑能实现串口连接后,打开软件,短信会自动导入到软件中。
答: 好在有许多成熟的安全和网络技术,例如虚拟私有网络(VPN)和防火墙等,能够极大地提高Web服务应用的安全和性能,让开发者拥有选择安全技术的自由,而不是非得使用尚...
答: 某些ADSL调制解调器使用USB接口与电脑相连,需要在电脑上安装指定的软件以添加虚拟网卡来进行通信
大家还关注
Copyright &
Corporation, All Rights Reserved
确定举报此问题
举报原因(必选):
广告或垃圾信息
激进时政或意识形态话题
不雅词句或人身攻击
侵犯他人隐私
其它违法和不良信息
报告,这不是个问题
报告原因(必选):
这不是个问题
这个问题分类似乎错了
这个不是我熟悉的地区
相关问答:123456789101112131415

我要回帖

更多关于 定时器时间 的文章

 

随机推荐