多线程问题
一个form 名 form1
唯一事件
Private Sub Form_Load()
Module1.creaeteSendThread
msgBox "here! "
End Sub
///////////////////////////////////////
一个Moduels 名 Moduel1
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
Public Declare Sub Sleep Lib "kernel32 " (ByVal dwMilliseconds As Long)
Public Const SLEEP_TIME = 2000
Public Function doSendMessage()
While True
MsgBox "msg "
Sleep (SLEEP_TIME)
Wend
End Function
Public Function creaeteSendThread()
Dim hThread As Long
Dim ThreadID As Long
hThread = CreateThread(0, 0, doSendMessage, 0, 0, ThreadID)
End Function
为什么Form加载不了了?即程序执行子线程,而msgBox "here! "不执行.
[解决办法]
貌似错了吧.....
hThread = CreateThread(0, 0, doSendMessage, 0, 0, ThreadID)
改一下:
hThread = CreateThread(0, 0, AddressOf doSendMessage, 0, 0, ThreadID)
你的那种语法,是把doSendMessage的返回值作为API的参数传递进去.
而doSendMessage是个死循环,不会返回,于是createthread根本就不会执行成功,始终处于死循环的执行中.
不过改为我的语法,应该会挂,嘿嘿
因为你在线程里面调用了VB的内部函数(msgbox),以及API~~
你把线程体改一下,定义一个变量,然后把这个变量递增,并更新到窗体的标题上去
同时去除任何内部函数与API的调用,像这样:
dim I as long
do
i=i+1
form1.caption=i
loop
运行应该就能看到效果了(应该要编译再运行吧,IDE里好象总是单线程的)
祝你好运:)
[解决办法]
你这段简单的代码,目的是测试是否能够建立一个线程,并让它运行。你成功了,线程已经建立并运行。修改部分代码可以验证。
Private Sub Command1_Click() ’取消原Form_Load,换成两按钮
Module1.creaeteSendThread
End Sub
Private Sub Command2_Click()
Debug.Print "here! here! here! here! "
End Sub
Public Function doSendMessage() ‘IN Moduel1
While True
Debug.Print "msg "
Sleep (SLEEP_TIME)
DoEvents '此处加一句,为了调试用
Wend
End Function
Command1启动线程后,你可以多次点击Command2,甚至可以关闭form,你的线程依然运行。
================================================
一点议论:
在VB里能否实现多线程,争论很多,我持赞成态度。但你的例程竟然没有发现类模块,那就过于简单了。
简易的线程其属性则不完整,如:线程建立,挂起,通信,消亡...。
首先,线程通信机制不建立。这样你无法控制它,但在实验程序中,缺省也无可厚非,但看起来有死机的感觉。
其次,线程的挂起或休眠。你采用了sleep,别以为能像在delphi里可以在模块中调试线程。在模块中SLEEP不起泡的(不起到真正挂起线程,然后等待唤醒),在类模块则有效。
如果一定要在Moduel1里实现挂起,那你得动手写一个YourSleep函数,而不用API,正如我上面添加DOEVENTS,这也只为了观察而已。