DELPHI盒子
!实时搜索: 盒子论坛 | 注册用户 | 修改信息 | 退出
检举帖 | 全文检索 | 关闭广告 | 捐赠
技术论坛
 用户名
 密  码
自动登陆(30天有效)
忘了密码
≡技术区≡
DELPHI技术
lazarus/fpc/Free Pascal
移动应用开发
Web应用开发
数据库专区
报表专区
网络通讯
开源项目
论坛精华贴
≡发布区≡
发布代码
发布控件
文档资料
经典工具
≡事务区≡
网站意见
盒子之家
招聘应聘
信息交换
论坛信息
最新加入: xiao2024
今日帖子: 17
在线用户: 11
导航: 论坛 -> DELPHI技术 斑竹:liumazi,sephil  
作者:
男 uctao (uc) ▲▲▲△△ -
普通会员
2019/1/3 9:43:11
标题:
关于定时器的问题,希望各位大神能给点意见! 浏览:2161
加入我的收藏
楼主: 最近在做个小软件,要用到大量的定时器的功能,用途是:倒计时执行某一个任务,比如我的软件要用到大概十几项或者几十项的定时执行任务,每一项定时任务都设置好时间执行,然后开始倒计时,这样的话就要一个每秒计时器了,想这样大量用计数器的话,有什么好的办法实现?尽量减少占CPU,不影响主线程的消息机制,也就是不影响软件各窗体的消息堵塞,避免出现假死。
Delphi自带的控件TTimer肯定是排除掉的了。现在想到的是用多线程来实现定时器是最好的,但是不知道怎么做,望大神们指点下,谢谢
----------------------------------------------
老菜鸟也会飞
作者:
男 nevergrief (孤独骑士) ★☆☆☆☆ -
盒子活跃会员
2019/1/3 9:48:16
1楼: 十几项或者几十项就把TTimer排除掉了?我听到的说法是,windows下上万个定时器(至少好几千)才会撑不住。需要注意到是,几十个定时器肯定不会有问题,但是定时器是怎么执行你的内容的?如果耗时长的内容,应该开启线程去工作,避免你的工作内容卡死主线程。

其实你这个问题太简单了,写个for语句,生成从100到1000到5000个定时器,看Windows能撑到什么时候。
----------------------------------------------
只有偏执狂才能生存!
作者:
男 luckyrandom (luckyrandom) ★☆☆☆☆ -
普通会员
2019/1/3 10:16:44
2楼: 目前三百多个定时器表示正常
----------------------------------------------
SQL SERVER DBA QQ:315054403 曾经的Delphier  缘在上海
作者:
男 sail2000 (小帆工作室) ★☆☆☆☆ -
盒子活跃会员
2019/1/3 10:33:32
3楼: 1,QDAC 中有个 QWorker,谁用谁知道

使用 QWorker 做为计划任务引擎
http://blog.qdac.cc/?p=2794

2,不用定时器,定义好需要执行的任务列表,用一个线程循环检查时间,到就执行。。。
----------------------------------------------
delphi 是兴趣,和工作无关,即使它倒闭。又不靠它 delphi 吃饭,怕甚?
作者:
男 joman (joman) ▲▲▲▲▲ -
普通会员
2019/1/3 11:26:17
4楼: 我只能想到使用线程或线程池来处理
----------------------------------------------
DelphiWeb开发方案(开源):https://gitee.com/pearroom/DelphiWebMVC
作者:
男 gmxyb (gmxyb) ★☆☆☆☆ -
普通会员
2019/1/3 11:41:33
4楼: TTimer的本质都是时间到了,让程序收到了一个 WM_TIMER 消息,然后触发 OnTimer 事件,如果你在OnTimer中占用了大量的时间,就没法继续处理 WM_TIMER消息了。

所以重点是,要保证任务处理的独立性,哪怕只用一个1秒的定时器都可以,定时器唯一的任务就是每秒检查当前时间,某个时间一到,就启动一个独立的线程(或进程)去执行任务,注意不要去等待线程或进程,这样就不会影响定时器继续检查时间了。当然,如果任务不能重入,那需要用其他的手段实现。
----------------------------------------------
-
作者:
男 dbyoung (dbyoung) ★☆☆☆☆ -
普通会员
2019/1/3 12:16:57
5楼: 楼上说的很有道理。
TTimer的本质是消息。
如果TTimer在一个周期内,不能执行完成你所要执行的代码,只有另找它法。
1:暂停定时器
2:将来的消息加入到任务队列。再开一个线程执行这个队列的任务。执行完一个删一个。值得队列为空。线程循环检测。
----------------------------------------------
武汉天气不好
作者:
男 janker (janker) ★☆☆☆☆ -
盒子活跃会员
2019/1/3 17:29:27
6楼: 一个工控控件里有个计时器线程池(数组),可以参考下,叫什么忘了
----------------------------------------------
-
作者:
男 jackalan (nVicen) ★☆☆☆☆ -
盒子活跃会员
2019/1/4 19:01:46
7楼: 把你所有任务的执行时间进行计算,只用一个定时间进行检查,
时间到达后更新当前任务下次执行时间,然后创建任务线程。
----------------------------------------------
简单做人,认真做事。
作者:
男 laimama_1 (苞谷) ★☆☆☆☆ -
盒子活跃会员
2019/1/6 17:48:13
8楼: 强烈推荐QDAC中的QWorker,谁用谁知道!!!绝对是中国人搞出来的精品!!
----------------------------------------------
-
作者:
男 kinneng (kinneng) ★☆☆☆☆ -
盒子活跃会员
2019/1/9 0:34:14
9楼: 要那么多定时器干什么,CPU也没那么多定时器给你,
都是软件模拟的,不如自己来,用一个定时器就够了,
用一组整数去计时,那个时间到了,就创建线程并行
执行任务。或者时间到了,设置一个标志,用一个线程
循环检查标志,顺序执行任务。
----------------------------------------------
声明:本人不在论坛询问任何编程问题,请不要将我的帖子当成问题来回答。炒股一天,编程三年,不浪费时间了。 经常在外面,没空,不要找我..
作者:
男 letianwuji (大器晚成) ▲▲▲▲▲ -
普通会员
2021/11/8 17:34:17
10楼: 一个定时器就可以分别执行所有任务。
标记出未来2个小时内的所有执行点的时间戳。
只要误差在500之内的,都可以执行。
----------------------------------------------
相信自己,若自己都不相信,那还有谁可信。
作者:
男 pcplayer (pcplayer) ★☆☆☆☆ -
普通会员
2021/11/8 18:50:46
11楼: 楼主描述的功能,用多线程来做,比用 Timer 来做,更简单。

首先,你的任务就是一个 while 死循环。跳出循环的机制,是你自己定义一个变量来判断。你的程序如果想退出了,就改变那个变量。

在 while 里面,自己写一个 sleep(100) 加上一个计数器整数,如果你想等1秒,就循环10次,当你的计数器加到10,再执行下面的操作。这里为什么不干脆 Sleep(1000) 或者 Sleep(10秒) 呢?这样做的坏处是你的线程死在那里10秒,你就算改变了 while 的参数让它跳出来结束线程执行,也要等到10秒后。

然后,包含这个 while 循环的任务,你把它写到一个函数或者一个方法里面。

最后,用线程来调用这个方法。搞定。

用线程,目前比较简单的办法是:

   TThread.CreateAnonymousThread(
    procedure
    begin
      这里调用你的那个有 while 的任务方法。
    end
  ).Start;
----------------------------------------------
-
信息
登陆以后才能回复
Copyright © 2CCC.Com 盒子论坛 v3.0.1 版权所有 页面执行62.5毫秒 RSS