定点报时,如何判断时间是整点?

ooolinux 2019-12-16 05:16:17
定点报时,如何判断时间是整点?
...全文
1693 22 打赏 收藏 转发到动态 举报
写回复
用AI写文章
22 条回复
切换为时间正序
请发表友善的回复…
发表回复
ooolinux 2019-12-29
  • 打赏
  • 举报
回复
引用 21 楼 liups 的回复:
[quote=引用 20 楼 ooolinux 的回复:] 如果碰到程序运行时刚好整点,这种特殊情况还是麻烦的。
刚运行时可以报时一次,也可以不报,这都不重要。 变量Hour、 Minute、Second初始值:都说是整点了,只需要hour[/quote] ok
liups 2019-12-24
  • 打赏
  • 举报
回复
引用 20 楼 ooolinux 的回复:
如果碰到程序运行时刚好整点,这种特殊情况还是麻烦的。
刚运行时可以报时一次,也可以不报,这都不重要。 变量Hour、 Minute、Second初始值:都说是整点了,只需要hour
liups 2019-12-23
  • 打赏
  • 举报
回复
大家想多了吧!可能这样: 程序刚运行时确定要报时的下一个时间,比如现在10点多,那么就是11点。然后用一个定时器,触发时判断当前时间是否大于等于11点就可以了。是的话,设定为12点并报时一次。
ooolinux 2019-12-23
  • 打赏
  • 举报
回复
引用 18 楼 早打大打打核战争 的回复:
变量Hour、 Minute、Second,在Timer事件处理中判断并修改


就我说的那样写啊,有什么困难的?[/quote]

变量Hour、 Minute、Second初始值,如果碰到程序运行时刚好整点,这种特殊情况还是麻烦的。
liups 2019-12-23
  • 打赏
  • 举报
回复
引用 17 楼 ooolinux 的回复:
[quote=引用 16 楼 liups 的回复:] 大家想多了吧!可能这样: 程序刚运行时确定要报时的下一个时间,比如现在10点多,那么就是11点。然后用一个定时器,触发时判断当前时间是否大于等于11点就可以了。是的话,设定为12点并报时一次。
你这个思路,OnTimer事件处理函数怎么写?难道每个OnTimer不同?[/quote] 就我说的那样写啊,有什么困难的?
  • 打赏
  • 举报
回复
变量Hour、 Minute、Second,在Timer事件处理中判断并修改
ooolinux 2019-12-23
  • 打赏
  • 举报
回复
引用 16 楼 liups 的回复:
大家想多了吧!可能这样:
程序刚运行时确定要报时的下一个时间,比如现在10点多,那么就是11点。然后用一个定时器,触发时判断当前时间是否大于等于11点就可以了。是的话,设定为12点并报时一次。


你这个思路,OnTimer事件处理函数怎么写?难道每个OnTimer不同?
ooolinux 2019-12-18
  • 打赏
  • 举报
回复
@天行 应该可以,我偏向DecodeTime,定时器300ms应该也有足够的机会了。
ooolinux 2019-12-18
  • 打赏
  • 举报
回复
如果用DecodeTime,整点触发的时候分钟和秒钟要都为0,因素这么多还是可能漏过的。
ooolinux 2019-12-18
  • 打赏
  • 举报
回复
引用 13 楼 早打大打打核战争 的回复:
[quote=引用 9 楼 ooolinux 的回复:]
老概这个,59分时定时器为一秒,整点判断会不会可能漏过?


看你的精度要求了,定时器为1秒,整点报时应该触发于xx:00:00到xx:00:01之间。
如果考虑干扰因素,那就多了,首先定时器的计时精度和GetTickCount/GetTickCount64一样,只有15ms(多核系统)或者10ms(单核系统),其次windows的任务调度,同一线程两次运行的间隔是不能保证的,可能几十毫秒到几百毫秒,如果要求高精度的话,可以定时器检测59分,然后暂停定时器,用timeSetEvent设置一个1ms的多媒体计时器,不过多媒体计时器精度到1ms只有比较新的系统,win7+2代core架构以上才能支持,差不多近10年以来的电脑都可以。
[/quote]

这就比较复杂了。看来定时器设置为200或者300ms算了。
  • 打赏
  • 举报
回复
引用 9 楼 ooolinux 的回复:
老概这个,59分时定时器为一秒,整点判断会不会可能漏过?


看你的精度要求了,定时器为1秒,整点报时应该触发于xx:00:00到xx:00:01之间。
如果考虑干扰因素,那就多了,首先定时器的计时精度和GetTickCount/GetTickCount64一样,只有15ms(多核系统)或者10ms(单核系统),其次windows的任务调度,同一线程两次运行的间隔是不能保证的,可能几十毫秒到几百毫秒,如果要求高精度的话,可以定时器检测59分,然后暂停定时器,用timeSetEvent设置一个1ms的多媒体计时器,不过多媒体计时器精度到1ms只有比较新的系统,win7+2代core架构以上才能支持,差不多近10年以来的电脑都可以。
天行归来 2019-12-17
  • 打赏
  • 举报
回复
写个报时线程,做整点判断和整点提醒。不能遗漏是指什么整点必须报还是已经过去的整点也要重新报(这个意义不大)?线程sleep几毫秒,整点判断是按秒算,这个不会漏,担心多报,记录下最后一次整点报时时间,判断时把此条件加上就可以。 至于coding代码,对于7年csdn老鸟应该不是问题吧?
ooolinux 2019-12-17
  • 打赏
  • 举报
回复
蟹蟹一二三楼,整点报时要求是,不能遗漏,也不能重复。
山东蓝鸟贵薪 2019-12-17
  • 打赏
  • 举报
回复
timer事件

格式化本地时间
获取网络时间

if 格式化本地时间 = 获取网络时间 then
begin
//执行语句
end
else
begin
exit;
end;
天行归来 2019-12-17
  • 打赏
  • 举报
回复
引用 10 楼 ooolinux 的回复:
@天行 线程这个应该是可行的,不过整点报时没有什么功能,想看看定时器怎么设置能行。
定时器也没问题,定时器间隔设置个 100 毫秒

//FLastStruck 可以在程序启动时根据需要初始化
procedure TForm1.Timer1Timer(Sender: TObject);
var
  t: int64;
  dt: TDateTime;
  time: string;
begin
  dt := Now;
  t := DateTimeToUnix(dt);
  if t mod 3600=0 then
  begin
    time := FormatDateTime('yymmddhh',dt);
    if time<>FLastStruck then
    begin
      MessageBeep(10);
      lblTips.Caption := '整点报时:'+time;
      FLastStruck := time;
    end;
  end;
end;
天行归来 2019-12-17
  • 打赏
  • 举报
回复
可以用 unix 时间戳(秒) 模 3600(一个小时),如果可以整除,即整点. if DateTimeToUnix(时间) mod 3600=0 then 整点 else 非整点
ooolinux 2019-12-17
  • 打赏
  • 举报
回复
@天行 线程这个应该是可行的,不过整点报时没有什么功能,想看看定时器怎么设置能行。
ooolinux 2019-12-17
  • 打赏
  • 举报
回复
老概这个,59分时定时器为一秒,整点判断会不会可能漏过?
天行归来 2019-12-17
  • 打赏
  • 举报
回复
引用 6 楼 ooolinux 的回复:
[quote=引用 5 楼 天行归来 的回复:] 写个报时线程,做整点判断和整点提醒。不能遗漏是指什么整点必须报还是已经过去的整点也要重新报(这个意义不大)?线程sleep几毫秒,整点判断是按秒算,这个不会漏,担心多报,记录下最后一次整点报时时间,判断时把此条件加上就可以。 至于coding代码,对于7年csdn老鸟应该不是问题吧?
我是想用定时器轻量点,假如定时时间1秒,整点判断容易漏过,定时时间更短,又容易重复判断为整点。[/quote] 建议用线程,定时器是主线程的,主线程如果在做大量运算,定时器就挂住,算出来肯定不准。 并且 GetTickCount 可以直接返回毫秒级时间。
  • 打赏
  • 举报
回复
定时器15秒,判断分是否是59,是则把定时器间隔改成1秒,报时后再把间隔改成15秒



加载更多回复(2)

828

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 非技术区
社区管理员
  • 非技术区社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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