VB DoEvents函数有何弊端?有没有替代它的API函数?

贝隆 2009-04-20 09:45:49
我们都知道,DoEvents是将CPU的控制权从当前进程交出去,可以防止长循环下其他时间响应缓慢或不能响应,但我在实际使用中遇到了些问题(比如在VB实现多线程时,使用Doevents会程序崩溃的概率大大增加),我搞不清楚,搞得我现在在稍稍深层次一点的情况下都不敢使用DoEvents函数,又没有找到能替代的API函数,困惑啊!
大家讨论一下,我也好增加一些知识:)
...全文
1921 32 打赏 收藏 转发到动态 举报
写回复
用AI写文章
32 条回复
切换为时间正序
请发表友善的回复…
发表回复
my13513480001 2010-02-22
  • 打赏
  • 举报
回复
【VB DoEvents 语句的API升级版】
占位学习!谢谢
虽然暂时没时间看,不过重要接触的
water32 2009-12-23
  • 打赏
  • 举报
回复
DoEvents有重入问题,替代方法还是没有...最近挺苦恼这个问题的
IORI915189 2009-04-28
  • 打赏
  • 举报
回复
VB 多线程
只用API还稍好一点 用其他什么 一下就挂 就算在P代码模式下可以坚持一会 但也极不稳定

单线程就强多了
使用自身函数没什么需要考虑的 只要考虑你的API用法是否正确 尤其是内存相关的API
嗷嗷叫的老马 2009-04-28
  • 打赏
  • 举报
回复
只用DoEvents的话,应该首先考虑重入问题吧.
msdtx 2009-04-27
  • 打赏
  • 举报
回复
vb的单元线程还是同步调用,后台线程忙时你调用它,照样阻塞界面线程。DoEvents会导致重入,解决了重入问题就不会崩溃了。实际上不处理重入,即使没崩溃计算结果也是错的。
贝隆 2009-04-27
  • 打赏
  • 举报
回复
问题的关键是我总怀疑DoEvents会带来什么问题,听大家这么一说,应该是不考虑什么多线程,用DoEvents是很安全的?
slowgrace 2009-04-26
  • 打赏
  • 举报
回复
谢谢马,收藏先。
IORI915189 2009-04-26
  • 打赏
  • 举报
回复
用VB要的就是开发高效率 既然用了VB 就按VB的规矩来 VB本身就不支持多线程 只支持多进程。。。
一些人用VB 又不按VB的规矩来 老喜欢搞什么“创新” 得不偿失
嗷嗷叫的老马 2009-04-22
  • 打赏
  • 举报
回复
[Quote=引用 15 楼 slowgrace 的回复:]
引用 14 楼 myjian 的回复:
引用 13 楼 Veron_04 的回复:
对于VB而言,就不要提线程了,因为VB可以说根本就没有为多线程设计做过考虑,VB编制的多线程程序很不稳定,根本不值得考虑

VB6标准的支持多线程的方式是单元模型,MSDN里明确地说明了这一点.

VB6是基于COM的,那么就使用COM的单元模型来支持多线程了,并非是其它语言中使用API的方式.

稳定是没得说的,只是没有多少人用得熟练.


能不能另起一个帖说详细…
[/Quote]
http://topic.csdn.net/u/20080225/00/4a70c6f4-0a8b-4912-bb6a-74d856460f54.html

关于VB6的多线程实现方案,曾经发过一帖的,里面也有MSDN中的原文.

只是没多少人研究过,所以造成现在连知道的人都不多,VB6在很多人眼里还是不支持多线程的.....

主要就是一种思路,集成到一个EXE里面去了.

而老魏(Modset)写的那个DLL也是非常不错的,比我发现的这个方案在使用上更方便:

http://blog.csdn.net/Modest/archive/2008/05/08/2416967.aspx

这方面文章不太多,搜索"VB6 稳定多线程",主要就还是上面两篇,别的基本价值不太大.
PctGL 2009-04-22
  • 打赏
  • 举报
回复

... 哪跟哪啊
说的。。。
doevents 实际与线程关系不大,不是说多线程就没必要用了,do..loop 循环中加 doevents 是最正常的
doevents 的实现代码可以说是很全面,不仅仅是简单的响应空消息,还有sleep
如果在一个没有窗口的线程中使用doevents也是有效果的原因也是这个

至于说多线程中用 doevents 会崩溃。。。 vb多线程有几个100%稳定的?vb多线程不能访问对象,
doevents 是访问了对象的。

lz 的问题其实本身还是多线程的构造问题,普通的方法多线程中运行不了几步的通过改造多线程的构造是能够实现 doevents 的稳定的。。。。自己也不知道自己说什么了,反正lz 听劝的话,看看有些代码基本实现了多线程稳定
别直接createthread了
msdtx 2009-04-22
  • 打赏
  • 举报
回复
这么多高人都来了!发表愚见:如果DoEvents不够用,用线程又喂不饱CPU,可一使用自调度。自己来调度自己!不但能解决响应问题,还能简化设计。实现时要注意响应参数方式,对每个参数变动响应还是所有参数都改变才响应。有兴趣欢迎拍砖。
zz005 2009-04-22
  • 打赏
  • 举报
回复
'VB DoEvents 语句的API升级版
'作者:小恶魔 日期:2008-09-25

Public Declare Function GetInputState Lib "user32" () As Long

Public Sub newDoEvents() '这个是比较简单,功能较少
If GetInputState() <> 0 then DoEvents
End Sub

'------------------------
Public Const QS_HOTKEY = &H80
Public Const QS_KEY = &H1
Public Const QS_MOUSEBUTTON = &H4
Public Const QS_MOUSEMOVE = &H2
Public Const QS_PAINT = &H20
Public Const QS_POSTMESSAGE = &H8
Public Const QS_SENDMESSAGE = &H40
Public Const QS_TIMER = &H10
Public Const QS_ALLINPUT = (QS_SENDMESSAGE Or QS_PAINT Or QS_TIMER Or QS_POSTMESSAGE Or QS_MOUSEBUTTON Or QS_MOUSEMOVE Or QS_HOTKEY Or QS_KEY)
Public Const QS_MOUSE = (QS_MOUSEMOVE Or QS_MOUSEBUTTON)
Public Const QS_INPUT = (QS_MOUSE Or QS_KEY)
Public Const QS_ALLEVENTS = (QS_INPUT Or QS_POSTMESSAGE Or QS_TIMER Or QS_PAINT Or QS_HOTKEY)
Public Declare Function GetQueueStatus Lib "user32" (ByVal qsFlags As Long) As Long

Public Function cGetInputState() '这个可以按自己的要求定义,接收到什么消息才DoEvents
Dim qsRet As Long
qsRet = GetQueueStatus(QS_HOTKEY Or QS_KEY Or QS_MOUSEBUTTON Or QS_PAINT)
if qsRet<>0 then DoEvents
End Function
'有了上面2个函数就不怕影响循环中的运算效率了
'它可以让你的程序循环速度比使用 DoEvents 更快

PS:测试过,比VB DoEvents 快!

of123 2009-04-22
  • 打赏
  • 举报
回复

如果仅仅是防止循环中假死现象,没必要用 DoEvents,可以用 Me.Refresh 甚至 ProgressBar1.Refresh 等等。

但是,如果你在循环中等等外部的消息,例如 MSComm1.InBufferCount 等等,就必须使用 DoEvents。

所以,要看你的实际需求。
贝隆 2009-04-22
  • 打赏
  • 举报
回复
受益匪浅啊!
我就尝试过用VB实现多线程,但不稳定,后来就放弃了。
看来我还的多学习啊!
slowgrace 2009-04-22
  • 打赏
  • 举报
回复
[Quote=引用 14 楼 myjian 的回复:]
引用 13 楼 Veron_04 的回复:
对于VB而言,就不要提线程了,因为VB可以说根本就没有为多线程设计做过考虑,VB编制的多线程程序很不稳定,根本不值得考虑

VB6标准的支持多线程的方式是单元模型,MSDN里明确地说明了这一点.

VB6是基于COM的,那么就使用COM的单元模型来支持多线程了,并非是其它语言中使用API的方式.

稳定是没得说的,只是没有多少人用得熟练.
[/Quote]

能不能另起一个帖说详细点?
PctGL 2009-04-22
  • 打赏
  • 举报
回复
虽然稳定多线程的例子不少人都写过,甚至运行效果似乎也不错,但真正从vb这个语言的角度去解决的没几个
原因还是不少人不太不了解vb多线程崩溃的原因,最基本的多线程支持其实很简单就一个 api 的事,在创建线程
前多调用一个api就可以解决,如果添加对api,和更稳定的支持就不是仅仅一个api的事了,需要多做很多事
关于这方面的东西,我也写过,vbgood 的blog,可惜现在关门了。。。
yonggenliuliling 2009-04-22
  • 打赏
  • 举报
回复
学习!
rmini 2009-04-22
  • 打赏
  • 举报
回复
支持
yinweihong 2009-04-21
  • 打赏
  • 举报
回复
DoEvents实际上就是cpu轮换时间片,和多线程是相同的,所以。。。。

sleep比DoEvents更差,sleep是让cpu睡一定时间~
lyserver 2009-04-21
  • 打赏
  • 举报
回复
使用Sleep代替.
加载更多回复(12)

1,486

社区成员

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

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