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的都帮我看看啊,把代码拷进去试试啊
看看我这段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的都帮我看看啊,把代码拷进去试试啊
补充一点,如果你的代码可以运行(当然不行了),请把CLOSEHANDLE放在CREATETHREAD后面,而不是在UNLOAD里CLOSE,原因么就是和内核对象的记数有关。