首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > VB >

多线程有关问题

2012-02-23 
多线程问题一个form名form1唯一事件PrivateSubForm_Load()Module1.creaeteSendThreadmsgBoxhere! EndSub

多线程问题
一个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,这也只为了观察而已。


热点排行