VB延时

ZZQAMEC 2008-11-19 04:24:31
我的项目里有一个循环扫描的任务,每次扫描时如果发现A成立则延时一段时间去做B,如果C成立,则延时一段时间去做D.延时不需要很精确,但是不能用sleep,因为AB 和CD的任务是并列的,如果用Sleep会把另外一个任务阻塞掉.也不能用多线程,因为在我的项目中有很多个类似A成立延时做B的任务有很多,我只不过例举两对而已.是不是只能用settimer.在扫描中if A THEN SETTIMER,然后在对应的ontimer中做B.
...全文
925 20 打赏 收藏 转发到动态 举报
写回复
用AI写文章
20 条回复
切换为时间正序
请发表友善的回复…
发表回复
Tiger_Zhao 2008-11-24
  • 打赏
  • 举报
回复
如果这样的话用任务队列排队足够了,即使任务 B、D 应该“同时”执行,用任务队列排队执行也差不了几个微秒的时间,反正单线程最终还是顺次执行完任务的。
ZZQAMEC 2008-11-24
  • 打赏
  • 举报
回复
[Quote=引用 17 楼 Tiger_Zhao 的回复:]
如果你保证各个任务完全独立,不开线程用 timer 也可以,不过你需要考虑下面这些问题对你的任务是否有影响:
1)在用 timer 触发任务 B 开始执行后,另一个 timer 也到点开始执行任务 D,这样任务 B 就被中断了;
2)如果任务 D 的执行时间较长,这时条件 A 成立,再启动 timer,并且也到点开始执行任务 B,这样任务 B 就产生了重入问题。

一个独立的任务还是考虑用多线程,可以避免任务互相影响;用一些状态标志控制任务的…
[/Quote]
多谢回复,其实我说的任务也就是改变一个变量的值,不是长时间的任务.也不是同步的任务.用线程太牛刀了吧!
lg110 2008-11-24
  • 打赏
  • 举报
回复
在你的每一个任务的timer里面加上doevents
Tiger_Zhao 2008-11-24
  • 打赏
  • 举报
回复
如果你保证各个任务完全独立,不开线程用 timer 也可以,不过你需要考虑下面这些问题对你的任务是否有影响:
1)在用 timer 触发任务 B 开始执行后,另一个 timer 也到点开始执行任务 D,这样任务 B 就被中断了;
2)如果任务 D 的执行时间较长,这时条件 A 成立,再启动 timer,并且也到点开始执行任务 B,这样任务 B 就产生了重入问题。

一个独立的任务还是考虑用多线程,可以避免任务互相影响;用一些状态标志控制任务的执行,可以避免任务的重入。
我8楼提到的任务队列也可以考虑加在主线程中,这样用不着每个任务的延时都需要单独启动 timer。
51Crack 2008-11-21
  • 打赏
  • 举报
回复

Public Sub Waiting(ByVal seconds As Integer)
Dim tmpNow As Date = Now
While Now.Subtract(tmpNow).Seconds < seconds
Application.DoEvents()
End While
End Sub
blues_zhao_yang 2008-11-21
  • 打赏
  • 举报
回复
依我看还是重新设计一下你的算法吧,感觉没必要这么做
你如果坚持不用多线程的话,一个线程中一旦延时肯定要卡住的
yangmt204 2008-11-21
  • 打赏
  • 举报
回复
觉得这么多任务要并行执行绝对要创建多线程吧。。。
ZZQAMEC 2008-11-21
  • 打赏
  • 举报
回复
各位TX,可能没太明白我的问题.我的问题是比如A成立,然后延时200MS,去做B; C成立,延时300MS,去做D; E成立,延时400ms去做F;........其中A,C,E....是条件;B,D,F...是任务;但是B,D,F,...这些任务是并行的.不能发现A成立了就去等待200MS去做B而不管其他的任务.我的做法发现A成立,就用settimer(或其他timer),然后在settimer的回掉函数中判断是不是对应A成立的timer到了,到了去做B,并且kill这个timer;如果对应C成立的timer到了,就去做D....我敢肯定我这个方法没问题,大家有没有更好的方法(通常做法)或我的方法有没有潜在的问题.
程序员Linc 2008-11-20
  • 打赏
  • 举报
回复
具体点呢?
用timer怎么做?
webqwer568 2008-11-20
  • 打赏
  • 举报
回复
自己写个延时函数:

Public Shared Sub Wait(ByVal numseconds As Long)
Dim start As Object, rightnow As Object
Dim HourDiff As Object, MinuteDiff As Object, SecondDiff As Object
Dim TotalMinDiff As Object, TotalSecDiff As Object

start = Now

While True
rightnow = Now
HourDiff = Hour(rightnow) - Hour(start)
MinuteDiff = Minute(rightnow) - Minute(start)
SecondDiff = Second(rightnow) - Second(start) + 1


If SecondDiff = 60 Then
MinuteDiff = MinuteDiff + 1 ' Add 1 To minute.
SecondDiff = 0 ' Zero seconds.
End If


If MinuteDiff = 60 Then
HourDiff = HourDiff + 1 ' Add 1 To hour.
MinuteDiff = 0 ' Zero minutes.
End If
TotalMinDiff = (HourDiff * 60) + MinuteDiff ' Get totals.
TotalSecDiff = (TotalMinDiff * 60) + SecondDiff


If TotalSecDiff >= numseconds Then
Exit Sub
End If

System.Windows.Forms.Application.DoEvents()

End While
End Sub

我现在一直在用。
tfnpghl 2008-11-20
  • 打赏
  • 举报
回复
Threading.Thread.Sleep(10000)'让程序运行停10000秒
blues_zhao_yang 2008-11-20
  • 打赏
  • 举报
回复
创建定时器对象,Interval设为你需要的延时长度
Tick事件中判断
if A成立 then
执行B
end if
eastkiki 2008-11-20
  • 打赏
  • 举报
回复

Tiger_Zhao 2008-11-20
  • 打赏
  • 举报
回复
自己作一个有序列表,内部成员就两个属性 {开始时间,任务名称},按开始时间的升序排序。

创建一个有序列表的实例,作为任务队列。
创建一个定时器,定时器的工作就是查看任务队列的第一个成员,如果 开始时间>=当前时间,就执行相应任务,从队列中删除。
扫描部分可以放在定时器中,也可以放在循环中,如果A成立则将{当前时间+延时,B}加入队列(注意加入时会做排序),如果C成立则将{当前时间+延时,D}加入队列,以此类推。

rubbishsai 2008-11-20
  • 打赏
  • 举报
回复
timer 就是那个时钟控制 功能
你可以让他不停的刷新
这个事可以控制的 你看一下timer属性,可以随时关闭
Private Sub tirBrush_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles tirBrush.Tick
比如 if A运行 Then

进行处理什么
elseif B运行处理什么 then

end if
end sub
floadcloud 2008-11-19
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 feiyun0112 的回复:]
用timer控件
[/Quote]
顶!!!
blues_zhao_yang 2008-11-19
  • 打赏
  • 举报
回复
我觉得timer就可以达到你的要求啊
sueifeng1026 2008-11-19
  • 打赏
  • 举报
回复
楼上说的对
不行了你写个空循环
feiyun0112 2008-11-19
  • 打赏
  • 举报
回复
用timer控件
feiyun0112 2008-11-19
  • 打赏
  • 举报
回复
用time控件

*****************************************************************************
欢迎使用CSDN论坛专用阅读器 : CSDN Reader(附全部源代码)
http://feiyun0112.cnblogs.com/

16,717

社区成员

发帖
与我相关
我的任务
社区描述
VB技术相关讨论,主要为经典vb,即VB6.0
社区管理员
  • VB.NET
  • 水哥阿乐
  • 无·法
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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