handsome0916(13896398) 13:01:22
看看我这段VB代码,只要是两个线程向list输出数据的,直接运行就可以执行,make成EXE就没反映:
模块代码:
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 Declare Function CloseHandle Lib "kernel32" (ByVal hObject As Long) As Long
Public Declare Function CreateMutex Lib "kernel32" Alias "CreateMutexA" (lpMutexAttributes As Any, ByVal bInitialOwner As Long, ByVal lpName As String) As Long
Public Declare Function ReleaseMutex Lib "kernel32" (ByVal hMutex As Long) As Long
Public Declare Function WaitForSingleObject Lib "kernel32" (ByVal hHandle As Long, ByVal dwMilliseconds As Long) As Long
Public hMutex As Long
Public Const INFINITE As Long = &HFFFFFFFF
Sub OutText1()
For i = 1 To 100
DoEvents
Call Sleep(11)
Dim ii As Integer
ii = i
WaitForSingleObject hMutex, INFINITE
Form1.List1.AddItem i
ReleaseMutex hMutex
Next
End Sub
Sub OutText2()
For i = 1 To 100
DoEvents
Call Sleep(10)
Dim ii As Integer
ii = i
WaitForSingleObject hMutex, INFINITE
Form1.List1.AddItem i
ReleaseMutex hMutex
Next
End Subform的代码:
Public threadid1 As Long
Public threadid2 As Long
Private Sub Command1_Click()
hMutex = CreateMutex(Null, True, "tickets")
WaitForSingleObject hMutex, INFINITE
ReleaseMutex hMutex
Call CreateThread(Null, ByVal 0&, AddressOf OutText1, VarPtr(0), ByVal 0&, threadid1)
Call CreateThread(Null, ByVal 0&, AddressOf OutText2, VarPtr(0), ByVal 0&, threadid2)
End Sub
Private Sub Form_Unload(Cancel As Integer)Call CloseHandle(threadid1)
Call CloseHandle(threadid2)End Sub 
handsome0916(13896398) 13:06:15
有用过VB的能帮我测试下吗?把代码拷进去就能运行的了,看看还要加什么,不知道为什么make成exe后运行没反应 
handsome0916(13896398) 13:07:08
在界面上加个list1,和一个按钮按钮的事件函数就是Command1_Click() 
handsome0916(13896398) 13:14:08
碰过VB的都帮我看看啊,把代码拷进去试试啊

解决方案 »

  1.   

    呵呵,是啊,是啊,前几天偶没事玩系统还原,玩多线程,玩着玩着就死机了,这下可好了,动用了FinalData老大才修复了有用的数据,一个80G的硬盘,一个160G的硬盘,直接搞死我了
      

  2.   

    用ActiveX EXE来模拟实现多线程。不过VB一般只能做多个单元线程而不是所谓的自由线程,当然要多个单元线程共享数据也是有方法的,楼主可以参见“VB组件工具指南”这书,是微软出版的
      

  3.   

    老问题了。编译后是不行的,VB的局限性,不支持自由线程(楼上说过了)。
    补充一点,如果你的代码可以运行(当然不行了),请把CLOSEHANDLE放在CREATETHREAD后面,而不是在UNLOAD里CLOSE,原因么就是和内核对象的记数有关。