- 1、本文档共5页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
VB多线程.doc
vb 实现多线程
很多人对VB多线程的评价就是不稳定,不安全其实这是一种完全不正确的评论VB程序对多线程的支持还是非常让人惊喜的只不过多线程无法在IDE中进行调试而已而所谓的VB控件多数不是线程安全的也没有明确依据因为事实证明VB大部分控件可以再多线程操作下进行的!网上流传的大部分都是毫无实质性意义的文章要不说一大堆概念毫无解决方案直接进入实际教程:1.相关API:CreateThread(创建一个线程)声明:Public Declare Function CreateThread Lib "kernel32" _(lpThreadAttributes As Any, ByVal dwStackSize As Long, ByVal lpStartAddress As Long, _ByVal lpParameter As Long, ByVal dwCreationFlags As Long, lpThreadId As Long) As Long参数说明:lpThreadAttributes:对于我们的使用基本没什么太大的意义,说了也是废话,直接设定成Null即可,详情可以去MSDN查一下dwStackSize:堆栈的大小,如果对此不了解,直接设定为0,系统即自动调节lpStartAddress:线程函数指针,恩恩恩,使用AddressOf即可获得函数的指针了......lpParameter:为线程函数传递的参数,请注意,别乱传,尽量0传进去dwCreationFlags:线程的参数标志,可以创建挂起的线程或者立即激活线程,默认设定为0即可立即激活线程了lpThreadId:线程的ID返回值:线程的句柄以上核心的API声明完毕,只有一个,简单吧其实线程的难处还在后面,废话不多说,讲一下创建线程吧首先创建一个窗体,名称:Form1.一个模块,名称xywhThread窗体中建立一个标签模块内声明延时函数的API(如果不是多线程就不要用这个了,因为很卡,可以使用xywhAPI里面的延时函数)Public Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)然后在模块内建立一个过程,名称:xywhXC1过程的代码可以是这样:Sub xywhXC1()Dim i as long?????? '之前代码忘记了声明这个,在线城中是不被允许的。Dim TempStr As String???? For i = 1 To 10000???????? TempStr = CStr(i)???????? Form1.Label1.Caption = TempStr???????? Sleep 20???? NextEnd Sub在窗体的load事件中可以加入这样一个函数指令:asd = CreateThread(Null, 0, AddressOf xywhThread.xywhXC1, VarPtr(0), 0, threadid1)按照我上面的API说明解读,不难明白这是一个创建线程的语句 请注意,用VB玩线程要有很多的注意,最主要的是不能调试执行必须生成EXE然后执行最好是生成P-Code上面的程序做好以后保存,生成EXE然后执行以下试试看你就会发现程序运行后标签数字不断累加而且程序一点都不卡因为是多线程操作的啦想到在那里应用了吗?一直有很多垃圾评论VB多么多么不好效率多么多么低经过多线程优化过的VB程序效率其实完全可以和C媲美的!!! 请注意,这是一个非常严重的问题任何线程所应用到的变量,请注意,只要是线程贴边的任何变量都要声明!绝对不能使用隐式声明多线程虽然已经实现了但是......总感觉退出时候的对话框怪怪的这是为什么呢?大概比尔大叔没有想到世界上还有一部分执着的VB爱好者竟然能用VB写多线程所以比尔大叔也抱着侥幸心理的让VB在生成EXE时候的退出代码中只结束了主线程怎么证明?很简单保存工程(这是必须的!!!!!!!)然后在IDE里面调试执行然后暂停!看看窗口,咦,为什么那个啥啥啥标签还在更新因为IDE只能调试主线程OK然后点一下结束后果很严重,IDE直接挂掉其实程序退出时候造成的内存无法读取或写入的错误是由于VB卸载了主线程,但是却不卸载我们创建的线程因此当我们创建的线程还在继续工作并且访问主线程窗口的标签时就会出现无法访问的问题 那么怎么能够避免此问题呢?首先我们吧线程对象的循环数调整为100然后生成EXE执行看看标签更新到了1
文档评论(0)