如何使用vb实现0.1毫秒间隔的事件触发

marrycherry 2003-07-03 08:56:43
如果希望使用vb实现每隔0.1毫秒做一件事情
...全文
418 35 打赏 收藏 转发到动态 举报
写回复
用AI写文章
35 条回复
切换为时间正序
请发表友善的回复…
发表回复
pigpag 2003-07-22
  • 打赏
  • 举报
回复
至少在NT架构中,SRM位于操作核心,没有任何方法获取比它更高的优先权。
(有效期:2003年7月22日)
Pengcheng2006 2003-07-21
  • 打赏
  • 举报
回复
那么现在的计算机能不能被强制中断呀,以前的计算机有DMA通道,是很快的。现在的计算机的最高优先权中断是不是都分配给Windows了?若是的话,就是用汇编语言也没法控制计算机了。请指教,谢谢
DIPDARK 2003-07-21
  • 打赏
  • 举报
回复
总结:
软件和硬件是计算机的两条腿
有一条腿不好,也跑不快……
-----dipdark
pigpag 2003-07-21
  • 打赏
  • 举报
回复
这是一次性的啊。
优先级不到RealTime的是绝对不可能的
flyingscv 2003-07-21
  • 打赏
  • 举报
回复
可以,当然不是timer

多媒体时钟,可以想象是非常精确的
Public Const TIME_PERIODIC = 1
Public Const TIME_ONESHOT = 0
Public Declare Function timeKillEvent Lib "winmm.dll" (ByVal uID As Long) As Long

Public Declare Function timeSetEvent Lib "winmm.dll" (ByVal uDelay As Long, ByVal uResolution As Long, ByVal lpFunction As Long, ByVal dwUser As Long, ByVal uFlags As Long) As Long
pigpag 2003-07-21
  • 打赏
  • 举报
回复
因为现在的系统架构不是只让一个进程进行的。每个进程理论上获取的执行片断时间片长达20ms。
要让你能在每一毫秒都能监测一个运行着十几个进程的系统,也太困难了。
Pengcheng2006 2003-07-21
  • 打赏
  • 举报
回复
Windows系统我不大明白,VC我也不懂,我只学过Pascal和C语言。我说几句,请大家多多指点,谢谢!!!

我以前学过汇编语言,是MCS-51单片机80C31的,他的主频是12MHz,我开发过80C31系统,编过很多延时程序,最小延时很容易做到<0.1ms,但编大的延时反而有些难。难道现在的先进机器P4做不到吗?请朋友们指点迷津,谢谢!
icansaymyabc 2003-07-20
  • 打赏
  • 举报
回复
Oasis0535(绿洲) :
事实上定时功能都是由硬件实现的,而不是你觉不觉得的问题。
但是现在计算机里都有高精度计时器,否则QueryPerformanceFrequency这些API不能工作。
我坚信VC能做到就是说VC可以直接控制这个高精度计时器。就算在Ring3里不行,VC也能写Ring0的程序。
而你说的一秒钟触发5000次的那种定时器可能是由于你的资料太老了吧?要不,在3G的CPU里0.2ms 至少能执行20万条指令。如果操作系统以0.2ms为时间片来调度的话是不是太浪费了?当然我只是猜测,我没有见过任何资料。
绿洲 2003-07-15
  • 打赏
  • 举报
回复
hehe...我觉得很精确的定时功能并不是由程序实现的,而是由硬件实现的。因为通过软件实现的代价太大了:你必须精确计算你所执行过的所有指令所消耗的时间,必须有一个可以信赖的参照时间,这一切似乎离开硬件都不大可能实现。在加上现在的多任务操作系统,别说这么高要求的定时,两个程序同步运行没有特殊操作都实现不了。

我没有查资料,以前见过一个资料说的似乎是一秒钟触发5000次,也就是0.2ms好像没问题。操作系统的调度程序似乎就是用的这个定时器。谁手头有资料帮着查一下,谢谢
elfire 2003-07-15
  • 打赏
  • 举报
回复
Dim sDelay As Single

sDelay = Timer
Do While (Timer - sDelay < 0.5) And (Timer - sDelay > -1)
DoEvents
Loop
sxmzmxh 2003-07-15
  • 打赏
  • 举报
回复
不可能的,即使是驱动也会被线程切换,
在DOS等实时操作系统下才可能实现精确的时间控制。
qingming81 2003-07-15
  • 打赏
  • 举报
回复
测定时间的时间,把你要执行的代码加入一起测试。
qingming81 2003-07-15
  • 打赏
  • 举报
回复
判断1毫秒或10毫秒到底运行了多少条代码(走了多少个循环:循环中的语句可以只取判断语句,就可以判断得出作过多少次判断),然后将这个数字除10(如果是1毫秒)或除100(如果是10毫秒),就得到0.1毫秒时到底运行了多少条代码,然后你就用这个循环或类似的循环来控制程序走向,比如测试1毫秒内可执行10万条语句,当执行到1万条语句的时候,就触发你的事件!
qingming81 2003-07-15
  • 打赏
  • 举报
回复
有一个主意:但没有调试过。

使用一个循环来测试系统时间(这个循环可以做成动态的,即你可以在程序运行时就随时测试,没有必要先测试,系统有可能因为加载其它程序而引起变化)。判断1秒或10秒到底运行了多少条代码(走了多少个循环:循环中的语句可以只取判断语句,就可以判断得出作过多少次判断),然后将这个数字除10(如果是1秒)或除100(如果是10秒),就得到0.1秒时到底运行了多少条代码,然后你就用这个循环或类似的循环来控制程序走向,比如测试1秒内可执行10万条语句,当执行到1万条语句的时候,就触发你的事件!
icansaymyabc 2003-07-15
  • 打赏
  • 举报
回复
Oasis0535(绿洲):我并没有把你说的两个概念混淆。我只是说明了现代CPU的速度给0.1ms级的定时器提供了基础。想当年在 每秒1.5万条指令的CPU上都能实现55ms的定时。那么在每0.1ms 3-8万条指令的CPU上实现0.1ms的定时一定没有问题的。我保证VC能做到。大不了写个驱动程序来实现它。
James0001 2003-07-14
  • 打赏
  • 举报
回复
1. Waitable timer ?
2. QueryPerformanceCounter/QueryPerformanceFrequency
3. rdtsc
绿洲 2003-07-13
  • 打赏
  • 举报
回复
icansaymyabc(学习与进步):我认为你对定时器和指令执行速度概念之间有些混淆。

除了操作系统基本可以做到精确定时以外,任何程序只能在十毫秒级以上作大致的定时(eg.55ms as above),这个事情除非谁使用工控系统。
smalle 2003-07-13
  • 打赏
  • 举报
回复
最好用硬件计时器,但不是所有的硬件都支持,所以用API:TimeGetTime()可以得到1ms的精确级
nccxf 2003-07-13
  • 打赏
  • 举报
回复
1ms!!!!
拉倒吧你,no way
sworddx 2003-07-13
  • 打赏
  • 举报
回复
timer很不精确。
一个办法是设timer的interval=1,在其timer事件中定义一个静态变量,然后用gettickcount api来获取tick count(精确至毫秒),然后……
Sub Timer1_Timer()
Static lTmp As Long, Static lLast10Tick As Long, lTick As Long
lTick = GetTickCount()
If lTick - lLast10Tick = 10 Then '10 ms
Call Procedure() 'Procedure 为调用的过程名
lLast10Tick = lTick
End If
End Sub
加载更多回复(15)

1,486

社区成员

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

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