CreateThread调用参数‘lpParameter’不能传递

yixingpo 2016-02-01 02:32:53
顶层声明:
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
Dim Out3 As Long


简单调用:
Sub Test1()
Dim lp As Long, llp As Long, x As Long
lp = 1000
x = CreateThread(Null, ByVal 0&, AddressOf z_pHandle.OutText3, Varptr(lp), ByVal 0&, ThreadID1)
r = WaitForSingleObject(x, -1)
Debug.Print Out3 & "!"
End Sub
Sub OutText3(b As Long)
Out3 = C * 2
End Sub


lp的数值1000传递不到b中,为什么?
...全文
7448 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
赵4老师 2016-11-24
  • 打赏
  • 举报
回复
《Windows核心编程》
PctGL 2016-11-23
  • 打赏
  • 举报
回复
我之前看错了,正确的结果应该是2楼代码 Sub OutText3(byval b As Long) Out3 = b * 2 Debug.Print Out3 & "!" End Sub 再把这个的c改成b,如果还有错,那就见鬼了
yixingpo 2016-05-21
  • 打赏
  • 举报
回复
引用 9 楼 PctGL 的回复:

Declare Function CreateThread Lib "kernel32" _
    (lpThreadAttributes As Any, ByVal dwStackSize As Long, _
     ByVal lpStartAddress As Long, ByVal lpParameter As Long, _
     ByVal dwCreationFlags As Long, byval lpThreadId As Long) As Long
Sub OutText3(byval b As Long) Out3 = C * 2 Debug.Print Out3 & "!" End Sub
如下:lp的数还是传不到OutText3的b中,公共变量Out3还是=0 Sub OutText3(byval b As Long) Out3 = b * 2 'Debug.Print Out3 & "!" End Sub
PctGL 2016-05-21
  • 打赏
  • 举报
回复
Declare Function CreateThread Lib "kernel32" _ (lpThreadAttributes As Any, ByVal dwStackSize As Long, _ ByVal lpStartAddress As Long, ByVal lpParameter As Long, _ ByVal dwCreationFlags As Long, <strong><span style="color: #FF0000;">byval</span></strong> lpThreadId As Long) As Long
PctGL 2016-05-21
  • 打赏
  • 举报
回复

Declare Function CreateThread Lib "kernel32" _
    (lpThreadAttributes As Any, ByVal dwStackSize As Long, _
     ByVal lpStartAddress As Long, ByVal lpParameter As Long, _
     ByVal dwCreationFlags As Long, byval lpThreadId As Long) As Long
Sub OutText3(byval b As Long) Out3 = C * 2 Debug.Print Out3 & "!" End Sub
赵4老师 2016-05-18
  • 打赏
  • 举报
回复
为什么不使用多进程呢?
yixingpo 2016-05-18
  • 打赏
  • 举报
回复
引用 6楼赵4老师 的回复:
为什么不使用多进程呢?
呵呵…
yixingpo 2016-05-16
  • 打赏
  • 举报
回复
引用 3 楼 aspower_ 的回复:
另外,再vb下用CreateThread的线程很不稳定,因为vb大部分控件都不是线程安全的 而且多线程调试非常麻烦. 一崩溃就马上完蛋 我再稍微看了下你的代码 你再 Sub Test1()主线程里调用 Debug.Print Out3 & "!" 十有八九是得不到正确的输出的 Debug.Print Out3 & "!"你放到Out3 = b* 2里试下 应该就可以了
是这样的,我说一下我的想法: 在msdn中解释CreateThread的lpParameter可以传递参数。 那么我在Sub Test1程序中,利用CreateThread调用Sub OutText3(b As Long),并传递参数lp到参数b中, 然后WaitForSingleObject等待OutText3运行完毕后,Out3应该为2*b的值,也就是2*1000. 但实际中,lp参数根本就传递不到Sub OutText3(b As Long)的b里面去,b还是0
一笑拔剑 2016-02-04
  • 打赏
  • 举报
回复
另外,再vb下用CreateThread的线程很不稳定,因为vb大部分控件都不是线程安全的 而且多线程调试非常麻烦. 一崩溃就马上完蛋 我再稍微看了下你的代码 你再 Sub Test1()主线程里调用 Debug.Print Out3 & "!" 十有八九是得不到正确的输出的 Debug.Print Out3 & "!"你放到Out3 = b* 2里试下 应该就可以了
一笑拔剑 2016-02-04
  • 打赏
  • 举报
回复
第一楼上这sb的话千万不能信. 第二 Sub OutText3(b As Long) Out3 = C * 2 End Sub b和out3有关系? Sub OutText3(b As Long) Out3 = b * 2 End Sub
一笑拔剑 2016-02-04
  • 打赏
  • 举报
回复
Sub OutText3(b As Long)
    Out3 = C * 2
    Debug.Print Out3 & "!"
End Sub
赵4老师 2016-02-01
  • 打赏
  • 举报
回复
将lp定义为全局变量再试试

1,486

社区成员

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

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