一个form 名 form1
唯一事件
Private Sub Form_Load()
    Module1.creaeteSendThread
    msgBox "here!"
End Sub
///////////////////////////////////////
一个Moduels 名 Moduel1Public 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 = 2000Public Function doSendMessage()
    While True
        MsgBox "msg"
        Sleep (SLEEP_TIME)
    Wend
End FunctionPublic Function creaeteSendThread()
    Dim hThread As Long
    Dim ThreadID As Long
    hThread = CreateThread(0, 0, doSendMessage, 0, 0, ThreadID)
End Function
为什么Form加载不了了?即程序执行子线程,而msgBox "here!"不执行.

解决方案 »

  1.   

    Public Function doSendMessage()
        While True
            MsgBox "msg"
            Sleep (SLEEP_TIME)
        Wend
    End Function
    始终在运行,不出来了。
      

  2.   

    貌似错了吧.....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 longdo 
        i=i+1
        form1.caption=i
    loop运行应该就能看到效果了(应该要编译再运行吧,IDE里好象总是单线程的)祝你好运:)
      

  3.   

    谢谢!正入myjian所说!不能在线程里面调用vb的内部函数,及api这问题能解决吗?
      

  4.   

    麻烦着........我这段时间正好也在写一个多线程下载文件的DLL,也是遇到与这个差不多的问题多线程回调VB里的函数,而在这个函数里面我需要从参数中的字符串指针返回字符串可没有办法,API只能用类库声明一下....所有VB内部函数的功能,都要用API或语句自己处理....会烦死........我现在都在考虑发送消息过来用子类化处理了....直接回调真的烦死人....
      

  5.   

    呼呼.怎么办呢!我要在线程体调用以写好的函数.而那些函数是一定会有内部函数或api的.
      

  6.   

    你这段简单的代码,目的是测试是否能够建立一个线程,并让它运行。你成功了,线程已经建立并运行。修改部分代码可以验证。
    Private Sub Command1_Click()   ’取消原Form_Load,换成两按钮
        Module1.creaeteSendThread    
    End SubPrivate Sub Command2_Click()
        Debug.Print "here! here! here! here!"
    End SubPublic 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,这也只为了观察而已。
      

  7.   

    我搞的多线程, 有好多东西都做不到。 比如直接用VB的msgbox, 程序就悄无声息的退出了, 但是可以使用MessageBox API函数。。 还有什么麽app.path, form2.show/load form2/form2.visible=true 。等的都不可以。 不使用这些东西的话倒还是稳定,能正常退出,开个几十个线程都可以。 我想问下前面的msgbox app.path..等等是为什么?