文章探索:   分类:    关键字:  
  + 栏目导航
  + 相关文章
文本框中光标位置的获得
用VB导入导出你的IE收藏夹
VB应用程序访问SQL Server方法探讨
VB访问SQL Server数据库技术全揭密
自动上网抓数据的机器人
自己的IE——用VB制作浏览器
VB中如何保存Webbrowser中的整个页面..
在VB中该如何控制其它程序的弹出窗口..
保存webbrowser中的HTML内容
破译动网验证码的简单方法
轻松获取QQ密码
VB.NET获取硬盘序列号的方法
WEBBROWSER 技巧一(收藏)
VB自动登陆网络站点详解(二):Inet..
获取webbrowser控件网页的源码
WebBrowser控件说明
关于用VB做更漂亮的窗体的思考
VB中访问存储过程的几种办法
VB6中改变屏幕的分辨率和刷新频率
VB编写一个能显示百分比的自定义进度..
公农历转换VB类
VB.NET窗口渐淡关闭
使用VB实现邮箱自动注册(二):修改..
VB.NET轻松实现任务栏程序
VB.NET启动外部程序
利用vb实现图片上传
VB实现局域网内的文件传输
VB 一个Function传回多个值
在VB中实现多线程
VB 手机号码编码程序


技术教程 -> VB教程 ->  
怎样用VB写多线程
来源:转载   人气:1049   录入时间:2007-11-8
    
   作者:darkside〖ALT键﹢鼠标右键开始╱暂停;鼠标左键控制速度〗
   启动自动滚屏功能尽管vb5是apprent single-thread(单线程)的.但用addressof加上一些API,就可以非常容易的做多线程.(比VC容易的多,做出来的东西也一样快,因为都是用API). 每一个线程(线程,下同)约占用20毫秒的时间片.
   
   vb5有一个主线程.我们可以另外加一个工作线程.对于不清楚什么是单/多线程的程序元,我们用一个简单的列子来说明一下.
   再form里加上两个timer控件. 吧interval属性设成5000(5秒),然后在两个timer1_timer事件中放一个大loop, 如for 10000 next. 运行. 你会看到第二个timer控件不会在五秒后执行,除非timer1的for-next结束. 同样,如果你的程序中有大量的数据库读写.你的用户街面可能被"冻".这时,我们就需要用多线程来改进程序了.(当然你可以用DoEvents来避免被冻,但用DoEvents有横多副作用.这里不提).
   
   我们用的第一个API是CreateThread, VB的格式是:
   
   private declare function CreateThread Lib "kernel32" (byval pThreadAttributes as any, byval dwStackSize as long, byval lpStartAddress as long, lpParameter as any, byval dwCreationFlags as long, lpThreadID as long) as long. (从vb API text viewer中拿是最真确的语法)
   
   CreateThread的参数指出你将要创立的县城是什么样子的. CreateThread的返回值是一个县城的handle. 这里是vb的多县城初始化程序:
   
   Public Sub Initialize(lpfnBasFunc as long)
   dim dwStackSize as long
   dim dwCreationFlags as long
   dim lpThreadId as long
   dim lpParameter as long
   dim myNull as long
   myNull = 0& ’create a null pointer
   dwStackSize = 0 ’0表示用exe stack size
   dwCreationFlags = 4 ’用4表示初始化后先不激活,让别人来激活.
   Me.Thread = CreateThread(myNull, dwStackSize, lpfnBasFunc, myNull, dwCreationFlags, lpThreadId)
   if Me.Thread = myNull then
   Msgbox "create thread failed"
   end if
   end Sub
   下面是两个API用来激活/暂定该线程.
   
   private declare function ResumeThread lib "kernel32"(byval hThread as long)as longprivate declare function SuspendThread lib "kernel32"(byval hThread as long)as long
   
   让我们来用一个变量表示当前线程的状态.
   public ThreadStatus as boolean
   在vb里,可用property来实现ThreadStatus的管理.
   
   
   Public property Let Enabled(byval vNewValue as boolean)
   if vNewValue = true and Me.ThreadStatus = false then
   ResumeThread Me.Thread
   Me.ThreadStatus = True
   elseif Me.ThreadStatus = true then
   SuspendThread Me.Thread
   Me.ThreadStatus = False
   endif
   end Property
   
   这个简单的类可以用New Object来引用:
   ’make new thread object
   dim myThread as New clsThreads
   ’创建线程 Foo
   myThread.Initialize AddressOf Foo
   ’激活线程
   myThread.Enabled = True
   
   执行后,你可以用PVIEW95.EXE看到你的线程.
   你还可以提高你的线程的优先级.
   SetThreadPriority ’设优先级GetThreadPriority ’查优先级
   
   你把以上的程序加入timer例子,就会看到两个timer同时运行.
   这里要提醒一下. vb5的开发环境是单线程的.如果你的程序写错,或中断后试图恢复,往往会出错,有时是GPF错.总之,用vb写多线程可以写出和VC一样快的程序.而且开发容易的多,开发速度也快得多.
   




Copyright(C)2007-2024 广州市佳沛数码科技有限公司 版权所有
公司地址: 广州市荔湾区东漖北路560号511室
电话:020-81803473 传真:020-81544987