|
|
导航: |
论坛 -> DELPHI技术
斑竹:liumazi,sephil |
|
作者: |
|
2019/1/3 9:43:11 |
标题: |
关于定时器的问题,希望各位大神能给点意见! |
浏览:2161 |
|
加入我的收藏 |
楼主: |
最近在做个小软件,要用到大量的定时器的功能,用途是:倒计时执行某一个任务,比如我的软件要用到大概十几项或者几十项的定时执行任务,每一项定时任务都设置好时间执行,然后开始倒计时,这样的话就要一个每秒计时器了,想这样大量用计数器的话,有什么好的办法实现?尽量减少占CPU,不影响主线程的消息机制,也就是不影响软件各窗体的消息堵塞,避免出现假死。 Delphi自带的控件TTimer肯定是排除掉的了。现在想到的是用多线程来实现定时器是最好的,但是不知道怎么做,望大神们指点下,谢谢
----------------------------------------------
老菜鸟也会飞 |
作者: |
|
2019/1/3 9:48:16 |
1楼: |
十几项或者几十项就把TTimer排除掉了?我听到的说法是,windows下上万个定时器(至少好几千)才会撑不住。需要注意到是,几十个定时器肯定不会有问题,但是定时器是怎么执行你的内容的?如果耗时长的内容,应该开启线程去工作,避免你的工作内容卡死主线程。
其实你这个问题太简单了,写个for语句,生成从100到1000到5000个定时器,看Windows能撑到什么时候。
----------------------------------------------
只有偏执狂才能生存!
|
作者: |
|
2019/1/3 10:16:44 |
2楼: |
目前三百多个定时器表示正常
----------------------------------------------
SQL SERVER DBA QQ:315054403 曾经的Delphier 缘在上海
|
作者: |
|
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秒的定时器都可以,定时器唯一的任务就是每秒检查当前时间,某个时间一到,就启动一个独立的线程(或进程)去执行任务,注意不要去等待线程或进程,这样就不会影响定时器继续检查时间了。当然,如果任务不能重入,那需要用其他的手段实现。
----------------------------------------------
-
|
作者: |
|
2019/1/3 12:16:57 |
5楼: |
楼上说的很有道理。 TTimer的本质是消息。 如果TTimer在一个周期内,不能执行完成你所要执行的代码,只有另找它法。 1:暂停定时器 2:将来的消息加入到任务队列。再开一个线程执行这个队列的任务。执行完一个删一个。值得队列为空。线程循环检测。
----------------------------------------------
武汉天气不好
|
作者: |
janker (janker) |
★☆☆☆☆ |
-
|
盒子活跃会员 |
|
2019/1/3 17:29:27 |
6楼: |
一个工控控件里有个计时器线程池(数组),可以参考下,叫什么忘了
----------------------------------------------
-
|
作者: |
|
2019/1/4 19:01:46 |
7楼: |
把你所有任务的执行时间进行计算,只用一个定时间进行检查, 时间到达后更新当前任务下次执行时间,然后创建任务线程。
----------------------------------------------
简单做人,认真做事。
|
作者: |
|
2019/1/6 17:48:13 |
8楼: |
强烈推荐QDAC中的QWorker,谁用谁知道!!!绝对是中国人搞出来的精品!!
----------------------------------------------
-
|
作者: |
|
2019/1/9 0:34:14 |
9楼: |
要那么多定时器干什么,CPU也没那么多定时器给你, 都是软件模拟的,不如自己来,用一个定时器就够了, 用一组整数去计时,那个时间到了,就创建线程并行 执行任务。或者时间到了,设置一个标志,用一个线程 循环检查标志,顺序执行任务。
----------------------------------------------
声明:本人不在论坛询问任何编程问题,请不要将我的帖子当成问题来回答。炒股一天,编程三年,不浪费时间了。 经常在外面,没空,不要找我..
|
作者: |
|
2021/11/8 17:34:17 |
10楼: |
一个定时器就可以分别执行所有任务。 标记出未来2个小时内的所有执行点的时间戳。 只要误差在500之内的,都可以执行。
----------------------------------------------
相信自己,若自己都不相信,那还有谁可信。
|
作者: |
|
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;
----------------------------------------------
-
|
|