vb 为什么timer循环不占资源

timer循环的原理是什么,是如何回调timer1_timer过程的?为什么把间隔时间设置为1毫秒循环执行代码占用资源很小,而用while1=1循环执行代码占用资源非常大... timer循环的原理是什么,是如何回调timer1_timer过程的?为什么把间隔时间设置为1毫秒循环执行代码占用资源很小,而用while 1=1循环执行代码占用资源非常大?有什么办法不用timer并且占用资源小,来实现循环检查外部抛来的消息?
推荐个毛啊?
timer控件是设计好的控件,它会不断的把控制权交给操作系统,在操作系统空闲时执行。
如果你用while 1=1,那么你要人工添加doevents把程序控制权交给操作系统。

while 1=1
doevents
wend
这种回答也推荐?
展开
 我来答
mafan8
2012-11-19 · TA获得超过1.7万个赞
知道小有建树答主
回答量:927
采纳率:0%
帮助的人:779万
展开全部
可以考虑VB多线程编程吧,一样的类似创建一个timer一样的一个线程,和你现在的应用程序不相互影响
更多追问追答
追问
关键多线程如何实现跨线程之间的函数互调?
追答
下面的程序是个例子,控件自己添加,还要添加一个模块(菜单里的工程---添加模块)
3个text控件,1个command控件
你可以循环读取每个线程函数的返回值然后告诉主程序
模块代码:
Public Declare Function SetTimer Lib "user32" (ByVal hwnd As Long, ByVal nIDEvent As Long, ByVal uElapse As Long, ByVal lpTimerFunc As Long) As Long
Public Declare Function KillTimer Lib "user32" (ByVal hwnd As Long, ByVal nIDEvent As Long) As Long
Public Const TimeId As Long = 1 '线程ID
Public n1 As Long
Public Sub myProc()
'这里填写自己的过程或调用的函数
Form1.Text1.Text = myFun(n1)
n1 = n1 + 1
End Sub
Public Sub myProc1()
'这里填写自己的过程或调用的函数
Form1.Text2.Text = Form1.Text2.Text - 1
End Sub
Private Function myFun(n As Long) As Long
'调用函数

myFun = n
End Function

窗体代码:
Dim TimeInterval As Long '时间间隔,毫秒
Private Sub Command1_Click()
'创建线程
SetTimer Me.hwnd, TimeId, TimeInterval, AddressOf myProc
SetTimer Me.hwnd, 2, TimeInterval, AddressOf myProc1
End Sub
Private Sub Form_Load()
n1 = 0
Text1.Text = ""
Text2.Text = 1000
TimeInterval = 1000
End Sub
Private Sub Form_Unload(Cancel As Integer)
'结束线程
KillTimer Me.hwnd, TimeId
KillTimer Me.hwnd, 2
End Sub
Private Sub Text1_Change()
Text3.Text = "线程1执行结果" & n1
End Sub
本回答被提问者采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
chinaboyzyq
2012-11-19 · TA获得超过1.3万个赞
知道大有可为答主
回答量:1.3万
采纳率:89%
帮助的人:3277万
展开全部
timer控件是设计好的控件,它会不断的把控制权交给操作系统,在操作系统空闲时执行。
如果你用while 1=1,那么你要人工添加doevents把程序控制权交给操作系统。

while 1=1
doevents
wend
追问
我当然加了DoEvents,我会因为一个DoEvents甩出200分吗?你自己去试试用DoEvents编译一个EXE,然后运行起来看看CPU占用率,在做一个窗体加10个间隔时间为1MS的TIMER去比较一下,timer控件的CPU占用率几乎为0,所以timer控件绝不可能是移交控制权这种方式循环的.
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
chenzh98
2012-11-19 · TA获得超过393个赞
知道小有建树答主
回答量:406
采纳率:0%
帮助的人:180万
展开全部
不用Timer控件,可以使用Windows API:sleep(毫秒数)。作用就是等待一点时间,比用dovents要好,因为doevents没法精确计时,只是用来释放资源给其它程序用的。
更多追问追答
追问
你说的和我问的就是两码事,SLEEP和TIMER的功能你都没搞清楚,一个是无控制权的延时,一个是实现异步操作,我要的是尽可能占用少的资源来循环检测外部传进来的消息!
追答
timer应该是用计时中断实现的定时触发,你也想用这种方式的话,就不适合用VB来解决
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
风雪剑无痕
2012-11-19 · TA获得超过1253个赞
知道大有可为答主
回答量:1691
采纳率:100%
帮助的人:1681万
展开全部
Timer事件每隔一段时间才会触发一次,降低优先级试试
追问
在VB代码 中while 1=1里如何降低优先级?
追答
在事件触发之前啊亲,你先不要那么多牢骚,好好找找资料研究一下才是正途
我只帮你找一个,自己再找找看
http://zhidao.baidu.com/question/122133163.html
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
kolinskysky
2012-11-19 · 超过16用户采纳过TA的回答
知道答主
回答量:48
采纳率:0%
帮助的人:46.5万
展开全部
你所谓的:实现循环检查外部抛来的消息。能具体些吗?
追问
我用Activex exe创建N个多线程,主程序告诉每个线程要做什么(这个好说,主程序直接调用Activex exe的函数即可)当线程处理完要做的事后需要通知主程序做完了,如果是单线程可以传递接口来让组件调用,从而通知主程序,但是多线程不能传递接口,类,对象等,所以我打算做个消息池,主程序和线程都不停循环读这个消息池的内容,当主程序要线程做事,就抛一个消息到池里,线程读到并执行,执行完抛完成的消息到池,主程序读到后便知道线程处理完了
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(3)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式