计时器运行的原理与大量计时器不同步问题

dingdong3211 2014-12-30 11:30:45
加精
一个主计时器控制3个子计时器,interval均为100ms,目标是按循序print 1,2,3
点击command1后,下列代码的结果是print:2,1,3 显然不是自己想要的。

1.如果将横线处sleep 100 改为sleep 200 则正常print 1,2,3。

2.如果均不加延时,则完全随机print

在编写程序中经常需要用到大量计时器,因而也经常出现奇奇怪怪的不同步问题,总而言之,还是对timer的运行原理理解不够。

个人主观的认为:
1.不涉及外部计时器的内部指令是从上到下执行的,
2.而控制外部计时器时,则与外部计时器间隔有关,有时同步有时不同步。

恳请高手释疑

Private Sub Command1_Click()
Timer.Enabled = True
End Sub

Private Sub Timer_Timer()
Timer1.Enabled = True

DoEvents
Sleep 100 ---------------------------------------


Timer2.Enabled = True

DoEvents
Sleep 100

Timer3.Enabled = True

Timer.Enabled = False
End Sub


Private Sub Timer1_Timer()
Print "1"
Timer1.Enabled = False
End Sub

Private Sub Timer2_Timer()
Print "2"
Timer2.Enabled = False
End Sub

Private Sub Timer3_Timer()
Print "3"
Timer3.Enabled = False
End Sub
...全文
3459 66 打赏 收藏 转发到动态 举报
写回复
用AI写文章
66 条回复
切换为时间正序
请发表友善的回复…
发表回复
hwangce 2015-01-30
  • 打赏
  • 举报
回复
一般定时器工作思路,在windows系统中,timer本身是有误差的,如果要高精度就要使用高精度封装进行消息的传递 timer() { count++ //定时器计数 if(count>N) count =0 //定时器计数到最大时候清零 switch count: { case n1: 任务1;break case n2:任务2; break } }
kisskk2010 2015-01-18
  • 打赏
  • 举报
回复
用一个定时器,一次只执行一次交易。
  • 打赏
  • 举报
回复
伊顺鸣 2015-01-15
  • 打赏
  • 举报
回复
可以的啊。。。
l4kangaxx 2015-01-13
  • 打赏
  • 举报
回复
新手刚上路时,完成任务不要急于求成,领导让你一天完成一个怎么看都不简单的任务,因为他知道你会去百度。你这么百度下去就废了,你又不是百度工程机。你应该尽力自己做,去找类似的工程案例,买书,慢慢学慢慢做,宁可奖金受损不可前途受损。 当然,前提是你得清楚自己的潜力。你就问自己,数学学好过没有。
Time Wolf 2015-01-12
  • 打赏
  • 举报
回复
q285361553 2015-01-12
  • 打赏
  • 举报
回复
太牛了....
kisskk2010 2015-01-11
  • 打赏
  • 举报
回复
好长。。。眼睛好累,,,没看完,对不起楼猪了。。。不过还是支持你
nettman 2015-01-09
  • 打赏
  • 举报
回复
关注下
dickysl 2015-01-09
  • 打赏
  • 举报
回复
感觉好复杂,学习了~
msdtx 2015-01-08
  • 打赏
  • 举报
回复
WM_TIMER是低优先级的消息,丢了是正常的。要保证有正确的执行时间可以考虑用一个timer,并且设置一个适当间隔时间,在onTimer事件里在读系统时间,根据系统时间(或系统运行时间)自己分发定时事件。如果延迟小于80ms,建议使用别人封装的高精度定时器。
dingdong3211 2015-01-06
  • 打赏
  • 举报
回复
引用 37 楼 qianjin036a 的回复:
讨论得太高深了,根本看不懂,不过把楼主的程序复制运行一下,结果与讨论所确定的命题有所不同,但确满足楼主的需求,好奇了...
可能与cpu主频有关,我换了个性能高点的机器,就又没有问题了。但若间隔改的再小点,应该还会出现。
dingdong3211 2015-01-06
  • 打赏
  • 举报
回复
引用 32 楼 u011326712 的回复:
vb不能多线程,用vb.net吧。我的自动化交易用两个线程解决,一个接受行情,一个计算并交易。
俺现在用的程序框架是用三个计时器同时运行,一个计时器获取行情,一个计时器连接数据库计算均线,一个计时器作为进出场主控制器。 我是新手,大学学过一点vb,就用6.0编了一个,线程问题还是最近才了解。很有用的参考,谢谢!
dingdong3211 2015-01-06
  • 打赏
  • 举报
回复
引用 21 楼 lm_whales 的回复:
计算可以开线程,VB可以用API开线程 1)定时器不要做太多的工作,否则会有积压 2)定时器不要Sleep,Sleep 会造成定时器积压 积压的定时器,会造成界面和其他操作延迟 定时的时间间隔不要太小,虽然定时器,代码简短时候,可以保证 时间间隔小的操作,平均时间间隔的得到保证 但是会瞬间连续启动n 次定时器,不是你想要的 定时器的界面操作也不宜太多,更多的界面操作,还是交给事件处理 PS: 定时器不宜太多
实际上最多的时候一次使用了120个计时器,但是由于交替控制,因此一次只有不超过3个计时器在运行,其他计时器全部处于关闭状态。 您说的sleep问题确实存在,后来专门进行了测试:两个计时器,一个间隔(1000ms)代码为sleep 1000,另一个间隔(2000ms)代码为print "hello"并获取执行代码的毫秒级时间,结果是print"hello"发生在3000ms之后,有时发生在1000ms后 我现在又遇到一个问题:buystopmaintimer为主控,buystoptimer1为子控 interval全为100ms,代码如下。正常情况下应该是buystoptimer1触发后自行关闭不会被触发,但是在实际运行过程中,偶尔会出现重复发送代码指令的问题。(备注:产生问题的可能原因:第三方计时器中有一次doevents sleep 50的代码,若同时触发可能产生这个问题,但是按照我在上述的测试,sleep后被中断倒计时的buystoptimer1r应当会继续执行代码而不是又执行一个间隔) Private Sub BuyStopMainTimer_Timer() Dim i As Integer For i = 1 To 4 Me.Controls("BuyStopTimer" & i).Enabled = False Next DoEvents Sleep 50 Me.Controls("BuyStopTimer" & BuyHoldClass).Enabled = True BuyStopMainTimer.Enabled = False '自关闭 End Sub Private Sub BuyStopTimer1_Timer() If BuyHoldClass = 1 Then If Buy1P <= BuyBaseP + N * (BuyAimClass - 1) - N * 2 Then MaiChuP Volume * 1, L_Stop BuyAimClass = BuyAimClass - 1 BuyHoldClass = 0 BuyTimer2.Enabled = False BuyStopTimer1.Enabled = False '自关闭 End If End If
lm_whales 2015-01-06
  • 打赏
  • 举报
回复
Sleep 50 这个代码会影响BuyStopMainTimer_Timer这个定时器的下一次执行, 结果就是这个定时器的一次执行, 可能会延迟下一个次的执行 其实,定时器跟,Sleep 功能几乎一样,不同的是,Sleep 会中断本函数的继续执行, 定时器只是打断在正在执行的代码序列,插入一段定时执行的代码序列 一个 DoEvents,也只是给界面一次处理事件的机会.作用不大 一般 DoEvents 是不用于 定时器事件的 而是用于 其他界面响应事件(防止代码执行事件过长,界面失去响应,程序假死), 并且多半是用于循环中的
u011224385 2015-01-05
  • 打赏
  • 举报
回复
感觉好复杂,学习了~
Tiger_Zhao 2015-01-05
  • 打赏
  • 举报
回复
多定时器完全是设计错误,按我#8的例子用单个定时器就能实现的。
楼主你想太多了!
赵4老师 2015-01-05
  • 打赏
  • 举报
回复
提醒:处理不过来时需要使用FIFO队列保存请求和结果,并监视FIFO队列防止溢出。
vansoft 2015-01-05
  • 打赏
  • 举报
回复
理论上来说三个计时器干的活,应该是相应没有影响,没有任何关系的。 如果有关系或是有先后顺序,应该是一个计时器来控置。 或者是一个计时器完了,再调下一个计时器。
xusir98 2015-01-04
  • 打赏
  • 举报
回复
加载更多回复(38)

1,451

社区成员

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

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