怎么向线程中传递参数?

yuchun0607 2004-09-24 03:34:08
sub mySub(byval str1 as string)
...
end sub

那么线程如何创建???
...全文
446 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
  • 打赏
  • 举报
回复
把要传递的参数和返回值全部放在类或者结构体里.
Structure MyParameters
Dim nNum As Integer
End Structure

Public paramPM(3) As MyParameters

Public Function sPM2(ByVal paramPM As MyParameters) As String
MessageBox.Show("Hello"+paramPM.nNum.ToString())
Return ""
End Function

ThreadPool.QueueUserWorkItem(New WaitCallback(AddressOf sPM2), paramPM(0))
ThreadPool.QueueUserWorkItem(New WaitCallback(AddressOf sPM2), paramPM(1))
ThreadPool.QueueUserWorkItem(New WaitCallback(AddressOf sPM2), paramPM(2))
ThreadPool.QueueUserWorkItem(New WaitCallback(AddressOf sPM2), paramPM(3))


两行代码就搞定的事情,需要给几百行文字吗?
  • 打赏
  • 举报
回复
LZ能不能帖出具体的代码啊??
这样就方便别人遇到相同的问题的时候,直接看代码就可以解决问题了.不用重新走一回LZ走过的老路.
还有就是,LS各位回答的时候,如果不懂就不要乱扯了.浪费观众宝贵的时间去阅读那些几百几千行,但是实际只有几行有用的文章.
yuchun0607 2004-09-24
  • 打赏
  • 举报
回复
谢谢大家啊!!!
haitao5676 2004-09-24
  • 打赏
  • 举报
回复
参数和返回值
从线程池线程返回值有点复杂。不允许使用从函数调用返回值的标准方法,因为只有 Sub 过程可以排队进入线程池。提供参数和返回值的一种方法是将参数、返回值和方法包装到包装类中,如线程参数和返回值中所述。一种更简单的提供参数和返回值的方法,是使用 QueueUserWorkItem 方法的 ByVal 状态对象变量(可选)。如果使用此变量将引用传递给类的实例,则该实例的成员便可以由线程池线程修改并用作返回值。您可以修改由变量(通过值传递)引用的对象,这在开始可能并非显而易见,但的确是可能的,因为只有对象引用是通过值传递的。对由对象引用所引用的对象成员进行更改之后,这些更改将应用于实际的类实例。

不能使用结构返回状态对象中的值。因为结构是值类型,异步进程所作的更改并不更改原始结构的成员。如果不需要返回值,则可以使用结构提供参数。

Friend Class StateObj
Friend StrArg As String
Friend IntArg As Integer
Friend RetVal As String
End Class

Sub ThreadPoolTest()
Dim TPool As System.Threading.ThreadPool
Dim StObj1 As New StateObj()
Dim StObj2 As New StateObj()
' 设置一些字段,用作状态对象中的参数。
StObj1.IntArg = 10
StObj1.StrArg = "某个字符串"
StObj2.IntArg = 100
StObj2.StrArg = "另一个字符串"
' 将一个任务排队
TPool.QueueUserWorkItem(New System.Threading.WaitCallback _
(AddressOf SomeOtherTask), StObj1)
' 将另一个任务排队
TPool.QueueUserWorkItem(New System.Threading.WaitCallback _
(AddressOf AnotherTask), StObj2)
End Sub

Sub SomeOtherTask(ByVal StateObj As Object)
' 将状态对象字段用作参数。
Dim StObj As StateObj
StObj = CType(StateObj, StateObj) ' 强制转换为正确的类型。
MsgBox("StrArg 包含字符串" & StObj.StrArg)
MsgBox("IntArg 包含数字" & CStr(StObj.IntArg))
' 将字段用作返回值。
StObj.RetVal = "SomeOtherTask 的返回值"
End Sub

Sub AnotherTask(ByVal StateObj As Object)
' 将状态对象字段用作参数。
' 状态对象作为 Object 进行传递。
' 将其强制转换为特定的类型以使其更易于使用。
Dim StObj As StateObj
StObj = CType(StateObj, StateObj)
MsgBox("StrArg 包含字符串 " & StObj.StrArg)
MsgBox("IntArg 包含数字" & CStr(StObj.IntArg))
' 将字段用作返回值。
StObj.RetVal = "AnotherTask 的返回值"
End Sub
haitao5676 2004-09-24
  • 打赏
  • 举报
回复

回复人: farrio(独孤求胜) ( ) 信誉:95 2004-09-24 17:11:00 得分: 0


遇到我以前问的问题了。
.net里面线程的入口函数是不能有参数的。
这个我个人认为好像和函数指针有关。


首先,现成的入口应该是过程,
其次,没有返回值可以,谁规定过程不能有参数?
strXiaoCaiNiao 2004-09-24
  • 打赏
  • 举报
回复
定义一个全局变量,再调用就可以了
farrio 2004-09-24
  • 打赏
  • 举报
回复
遇到我以前问的问题了。
.net里面线程的入口函数是不能有参数的。
这个我个人认为好像和函数指针有关。
haitao5676 2004-09-24
  • 打赏
  • 举报
回复
在模块里定义public变量,付给这些变量就行了
Brunhild 2004-09-24
  • 打赏
  • 举报
回复
这个可能对你有帮助:http://community.csdn.net/Expert/topic/3356/3356004.xml?temp=.6492731
其中我写的部分是VB。NET的
yuchun0607 2004-09-24
  • 打赏
  • 举报
回复
看的头晕,有没有vb.net的代码啊
brightheroes 2004-09-24
  • 打赏
  • 举报
回复
http://dev.csdn.net/article/20/article/29/29874.shtm

16,554

社区成员

发帖
与我相关
我的任务
社区描述
VB技术相关讨论,主要为经典vb,即VB6.0
社区管理员
  • VB.NET
  • 水哥阿乐
  • 无·法
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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