VBGood网站全文搜索 Google

搜索VBGood全站网页(全文搜索)

VB爱好者乐园(VBGood)

 找回密码
 立即注册
搜索
楼主: download

[原创] 全球首创? 再次突破VB极限!VB真正稳定多线程(不用tlb,tls,ax,pcode)

  [复制链接]
发表于 2010-4-29 18:21:22 | 显示全部楼层
PSS:另附上菜鸟学习的揭密(我也看不懂,有兴趣的可以去看看): http://www.vbgood.com/thread-92862-1-1.html

[/quote]那天只是马马虎虎的看了一下 然后就写了上去 再加上本人基础也不是那么扎实~就没怎么阐述清楚. 第一天看到CreateIExprSrvObj 这个东西的时候觉得似乎多神奇的 觉得这个可能是VB完美多线程的希望了,但是后来一听到这个东西不能用MSGBOX的时候就觉得可能是VB自带的"TLS大发",(因为原来研究多线程就遇到了这个问题),逐用本人微乎其微的反汇编看了一下CreateIExprSrvObj 的内部实现,果~~~然是VB自带的TLS大法(也算是TLS大法吧~只不过不是复制了,是自己分配一个内存到那个TLS索引,但是原理和原来的那个TLS大法是一样的),无奈水平不够 那个msgbox的问题就不知道了.
附:于是乎本人又想到了另外一种多线程的方法

  1. Option Explicit
  2. Public Declare Function CreateIExprSrvObj Lib "msvbvm60.dll" (ByVal p1_0 As Long, ByVal p2_4 As Long, ByVal p3_0 As Long) As Long
  3. Public Declare Function TlsSetValue Lib "kernel32" (ByVal dwTlsIndex As Long, lpTlsValue As Byte) As Long

  4. Public Declare Function CreateThread Lib "kernel32" (ByVal lpThreadAttributes As Any, ByVal dwStackSize As Long, ByVal lpStartAddress As Long, lpParameter As Any, ByVal dwCreationFlags As Long, lpThreadID As Long) As Long
  5. Public Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)
  6. Public Declare Function TerminateThread Lib "kernel32" (ByVal hThread As Long, ByVal dwExitCode As Long) As Long
  7. Public Declare Function TerminateProcess Lib "kernel32" (ByVal hProcess As Long, ByVal uExitCode As Long) As Long
  8. Public Declare Function GetCurrentProcess Lib "kernel32" () As Long
  9. Public Declare Function WaitForSingleObject Lib "kernel32.dll" (ByVal hHandle As Long, ByVal dwMilliseconds As Long) As Long
  10. Public Declare Function CreateEvent& Lib "kernel32" Alias "CreateEventA" (ByVal lpEventAttributes As Long, ByVal bManualReset As Long, ByVal bInitialState As Long, ByVal lpname As String)
  11. Public Declare Function SetEvent Lib "kernel32" (hEvent As Long) As Long
  12. Public lThreadHandle1 As Long
  13. Public lThreadHandle2 As Long
  14. Public lEventHandle As Long
  15. Public buf(168) As Byte

  16. Public Sub Main()
  17. frmOutput.Show
  18. End Sub
  19. Public Sub test_function()
  20. 'CreateIExprSrvObj 0, 4, 0
  21. TlsSetValue &HC, buf(0)
  22. Dim i As Long
  23. Dim ret As Long
  24. i = 0

  25. Do
  26. i = i + 1
  27. 'Sleep 10
  28. frmOutput.txtStream1 = i
  29. DoEvents
  30. ret = WaitForSingleObject(lEventHandle, 10)
  31. Loop Until ret = 0

  32. End Sub
  33. Public Sub test_function2()
  34. 'CreateIExprSrvObj 0, 4, 0
  35. TlsSetValue &HC, buf(0)
  36. MsgBox "ok?" '加上这句测试
  37. Dim i As Long
  38. Dim ret As Long
  39. i = 0
  40. Do
  41. i = i + 1
  42. 'Sleep 500
  43. frmOutput.txtStream2 = i

  44. ret = WaitForSingleObject(lEventHandle, 500)
  45. Loop Until ret = 0
  46. End Sub
复制代码
回复 支持 反对

使用道具 举报

 楼主| 发表于 2010-4-29 20:30:53 | 显示全部楼层

那天只是马马虎虎的看了一下 然后就写了上去 再加上本人基础也不是那么扎实~就没怎么阐述清楚. 第一天看到CreateIExprSrvObj 这个东西的时候觉得似乎多神奇的 觉得这个可能是VB完美多线程的希望了,但是后来一听到 ...
菜鸟学飞 发表于 2010-4-29 18:21


在VB的IDE中MSGBOX也只出现一次,后来就再也不出现了...
即使是使用PCODE,MSGBOX也不会出现.

由此推断:估计是MSGBOX自身实现的问题(不是线程安全)

PS:现在在研究AS代码,暂时没时间去追踪,有时间有兴趣的可以追踪MSGBOX研究一下..

附:于是乎本人又想到了另外一种多线程的方法


不知道你自己试了没?点击 START 按钮 就出错了...写入非法地址9C

  1. 00401244   Program entry point
  2.            Analysing 工程1
  3. 7C810669   New thread with ID 00000E94 created
  4. 660CC26F   Access violation when writing to [0000009C]
复制代码
回复 支持 反对

使用道具 举报

发表于 2010-4-29 20:49:02 | 显示全部楼层
我试过了啊~可以用啊~~怪了~~

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
回复 支持 反对

使用道具 举报

 楼主| 发表于 2010-4-29 21:38:28 | 显示全部楼层
我试过了啊~可以用啊~~怪了~~
菜鸟学飞 发表于 2010-4-29 20:49


下载你这个也出错. ?

系统: 英文XP+SP2

你这&HC是哪来的?硬编码?只支持你的系统? -_-!
回复 支持 反对

使用道具 举报

发表于 2010-4-29 22:02:48 | 显示全部楼层
MsgBox "ok?" '加上这句测试
CreateIExprSrvObj 0, 4, 0

交换一下msgbox的位置,立马挂掉。。。。
回复 支持 反对

使用道具 举报

发表于 2010-4-29 22:07:23 | 显示全部楼层
要仔细试试管不管用
回复 支持 反对

使用道具 举报

 楼主| 发表于 2010-4-29 22:40:12 | 显示全部楼层
MsgBox "ok?" '加上这句测试
CreateIExprSrvObj 0, 4, 0

交换一下msgbox的位置,立马挂掉。。。。
djrm_yb 发表于 2010-4-29 22:02


请看顶楼的说明,要加到第一句...
回复 支持 反对

使用道具 举报

发表于 2010-4-29 22:59:22 | 显示全部楼层
下载你这个也出错. ?

系统: 英文XP+SP2

你这&HC是哪来的?硬编码?只支持你的系统? -_-!
download 发表于 2010-4-29 21:38

呃~确实是硬编码~~~可能SP2不一样吧~汗~~~~
回复 支持 反对

使用道具 举报

发表于 2010-4-29 23:34:49 | 显示全部楼层
杯具啊 不高级的东西被当做玩具了 哇哈哈
回复 支持 反对

使用道具 举报

 楼主| 发表于 2010-4-30 07:15:11 | 显示全部楼层
呃~确实是硬编码~~~可能SP2不一样吧~汗~~~~
菜鸟学飞 发表于 2010-4-29 22:59


?rz
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

文字版|手机版|小黑屋|VBGood  

GMT+8, 2022-8-14 09:06

VB爱好者乐园(VBGood)
快速回复 返回顶部 返回列表