我用VB开了一个Thread,在VB环境下运行正常,但是编译后运行Exe文件会报内存写错误。我的操作系统为WinXP+SP1,真是郁闷啊,着急中

解决方案 »

  1.   

    VB6.0好像是不支持多线程的,   ,net支持我线程
      

  2.   

    VB6.0调用API函数就可实现多线程,不过超占CPU,不爽
      

  3.   

    是啊,我是用API实现的,在vb的环境下跟踪、运行均没有问题,但是编译之后独立运行就会出错。搞不懂到底是怎么回事
      

  4.   

    很正常,很多人在VB的多线程尝试,最后都在编译后结束的。这里的问题,很难说清楚,调试环境下,很多组件的内存共享都是在VB环境保护下的,系统知道这是一个整体,越组件读写是合法的。但编译后,VB程序离开保护需独立生存,有些内存操作就不会被系统允许了。而大多数情况下多线程间,共享内存是不可避免,怎么样规避这类读写,就要靠你在不断的崩溃与死机中去积累经验了。除了很多示例代码外,我的确还没见过,有人在VB下编出稳定实用的VB程序,不知道你会不会成功。
      

  5.   

    没有进行界面操作啊,我把线程简化成只要一个msgbox都还会出错。
      

  6.   

    那也不行,msgbox 不是界面吗? 贴一个我以前的'模块中的 Public playflag As Boolean
     Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)
     Declare Function CreateThread Lib "kernel32" (lpThreadAttributes As Any, ByVal dwStackSize As Long, ByVal lpStartAddress As Long, lpParameter As Any, ByVal dwCreationFlags As Long, lpThreadID As Long) As Long
     Declare Function CloseHandle Lib "kernel32" (ByVal hObject As Long) As Long
    Public Sub AsyncThread()   '不要要该过程中操作任何界面,不然程序会死的
       Dim i As Long
       Open "d:\temp.txt" For Output As #1
       For i = i To 10000
            If playflag Then
                Print #1, "第" & i & "次"
                Sleep (100)
            Else
                Close #1
                Exit Sub
            End If
        Next i
        Close #1
    End Sub
    'form中的Private Sub Command1_Click()
        mol.playflag = False
    End Sub
    Private Sub cmdplay_Click()
        playflag = True
        Dim hThread As Long, hThreadID As Long
        hThread = CreateThread(ByVal 0&, ByVal 0&, AddressOf AsyncThread, ByVal 0&, ByVal 0&, hThreadID)  '另外开一线程
        CloseHandle hThread
    End SubPrivate Sub Command2_Click()
        Dim i As Integer
        ProgressBar1.Max = 10000
        For i = 1 To 10000
            ProgressBar1.Value = i
        Next i
    End Sub
      

  7.   

    确实如此.vb6本身不支持多线程.不过使用active exe的方式实现多线程也是很好的方法.
      

  8.   

    在VB用API来使用多线程很容易发生死锁!