vb多線程源碼
① VB如何實現多線程
用CreateThread API函數根本無法實現VB6多線程!雖然系統提供了這個API函數,但是這種實現方法對VB6程序極其不穩定,容易出現非法操作。如果確實需要多線程的話,請使用控制項,此處可以下載MThreadVB
http://www.planet-source-code.com/vb/scripts/ShowCode.asp?txtCodeId=26900&lngWId=1
打字不易,如滿意,望採納。
② VB能不能實現多線程運行,
先說多線程:
方法 1 : CreateThread
不用多說,萬變不離其宗,這是 Win32 內創建線程的唯一系統方法,以下介紹的多線程創建方式雖然不直接接觸這個 Win32 APi,但系統也是通過他創建的。
方法 2 : TimerSetEvent
這個函數是 Win32 系統的一個高精度計時器函數,通過調用這個函數,系統會創建一個新的線程,讓Timer回調函數中的代碼運行在這個新線程中。
方法 3 : SHCreateThread
很多人應該沒見過這個函數,這是 shlwapi.dll 的一個導出函數,這個函數看字面也能理解是個創建多線程的函數,而且。。。 他是基於對象操作的多線程函數,也就是說他能夠穩定的運行一些用上面2種方法創建,但不能穩定運行的代碼。至少這個函數在 IDE 的環境下表現的中規中矩! 使用方法可查 API-GUIDE
方法 4 :CreateRemoteThread
創建遠程線程,經測試一點也不穩定,根本沒法說下去了,還不如直接調用 CreateThread
但,做為一種線程的創建方法,還是希望能夠熟悉一下,如果不用VB寫代碼,要寫跨進程線程,這是一個簡單易行的辦法,否則只能繼續SetWindowHook了,熟悉匯編指令的還可以遠程分配內存寫硬編碼執行
方法 5 : 簡單說下 ActiveX 方式的多線程
用 ActiveX 創建線程與其他方式創建的線程最重要的地方要主義,任何VB函數的調用最好都建立在新線程中新初始化的對象基礎上執行,不要跨對象調用,而 ActiveX 的安全線程本身也正是利用了這點,不知道研究 ActiveX 的老大們有沒注意,利用他特性實現的多線程,是初始化的一個新的線程,而這個線程中初始化的對象則是整個工程。很大的資源浪費,而且有時候還不好控制,不是你想要的效果。總之一句話,新線程中要自己初始化新的對象而且最好不要用實例繼承
③ VB怎麼樣實現多線程
據說 ACTIVEX.EXE文件 叫多進程 並非多線程~
其實你不如用VB.net來創建多線程 2,3行代碼而已
用合適的工具 解決問題才是首選
④ VB中如何實現多線程
用CreateThread API函數根本無法實現VB6多線程!雖然系統提供了這個API函數,但是這種實現方法對VB6程序極其不穩定,容易出現非法操作。如果確實需要多線程的話,請使用控制項,此處可以下載MThreadVB
http://www.planet-source-code.com/vb/scripts/ShowCode.asp?txtCodeId=26900&lngWId=1
⑤ vb多線程:怎樣用VB寫多線程
如果是vb6.0不好實現,即使使用網上的api函數或者vb幫助里的activedll實現效果都不是很好!
我的方法是,直接使用多進程代替多線程!
⑥ VB怎麼實現穩定的多線程程序
相關代碼如下:
Private Const MyEvent As String = "m5home"
Dim hEvent As Long
Sub Main()
If GetEventHandle = 0 Then '由於每個新對象的建立,都要執行Main()過程,因此使用事件對象來進行判斷.
hEvent = CreateEvent(0&, False, False, MyEvent) '在單元線程下,模塊里的全局變數已經沒有用了.frmMain.Show
End If
End Sub
Private Function GetEventHandle() As Long
GetEventHandle = OpenEvent(EVENT_ALL_ACCESS, False, MyEvent)
Call CloseHandle(GetEventHandle)
End Function
Public Function Quit()
Call CloseHandle(hEvent)
End Function
Private Const MyEvent As String = "m5home"
Dim hEvent As Long
Sub Main() If GetEventHandle = 0 Then '由於每個新對象的建立,都要執行Main()過程,因此使用事件對象來進行判斷.
hEvent = CreateEvent(0&, False, False, MyEvent) '在單元線程下,模塊里的全局變數已經沒有用了.frmMain.Show
End If
End Sub
Private Function GetEventHandle() As Long GetEventHandle = OpenEvent(EVENT_ALL_ACCESS, False, MyEvent)
Call CloseHandle(GetEventHandle)
End Function
Public Function Quit()
Call CloseHandle(hEvent)
End Function
由於事件對象是系統范圍的,因此可以比較完美的完成這個工作.
同時事件對象在進程消失後,會自動釋放,也方便:)
示例代碼可以生成一個新的單元線程,並在這個線程裡面顯示一個窗體,窗體進行一個大循環.
循環內沒有放入DoEvents函數,因此會造成循環所在窗體無響應.
而此時主窗體不受影響.
⑦ 關於VB多線程的問題
兄弟啊。。VB搞這個總之是蹩腳。不是不行,而是毫無必要。我倒是會搞,不過實在是太麻煩了。寫起來會消耗很多時間,先給你一個臨時方案,不行就等我明天晚上有時間了在教教你。
在線程結束前使用API ExitProcess退出你的程序。
要領:切忌在VB中調試!ExitCode推薦傳入0.
⑧ VB多線程示例!
窗體代碼:Private Sub Command1_Click()
'為addnumber過程創建線程
Call CreateNewThread(AddressOf addnumber)
End Sub
Private Sub Command2_Click()
TerminateTh '終止線程
Unload Me '結束程序
End Sub
模塊:Private Declare Function CreateThread Lib "kernel32" (ByVal lpThreadAttributes As Any, ByVal dwStackSize As Long, ByVal lpStartAddress As Long, lpParameter As Any, ByVal dwCreationFlags As Long, lpThreadID As Long) As Long
Private Declare Function TerminateThread Lib "kernel32" (ByVal hThread As Long, ByVal dwExitCode As Long) As Long
Private Declare Function SetThreadPriority Lib "kernel32" (ByVal hThread As Long, ByVal nPriority As Long) As Long
Private Declare Function GetThreadPriority Lib "kernel32" (ByVal hThread As Long) As Long
Private Declare Function ResumeThread Lib "kernel32" (ByVal hThread As Long) As Long
Private Declare Function SuspendThread Lib "kernel32" (ByVal hThread As Long) As Long
Private Declare Function GetCurrentThread Lib "kernel32" () As Long
Private Declare Function GetCurrentThreadId Lib "kernel32" () As LongPrivate Const MAXLONG = &H7FFFFFFF
Private Const THREAD_BASE_PRIORITY_IDLE = -15
Private Const THREAD_BASE_PRIORITY_LOWRT = 15
Private Const THREAD_BASE_PRIORITY_MAX = 2
Private Const THREAD_BASE_PRIORITY_MIN = -2
Private Const THREAD_PRIORITY_HIGHEST = THREAD_BASE_PRIORITY_MAX
Private Const THREAD_PRIORITY_LOWEST = THREAD_BASE_PRIORITY_MIN
Private Const THREAD_PRIORITY_ABOVE_NORMAL = (THREAD_PRIORITY_HIGHEST - 1)
Private Const THREAD_PRIORITY_BELOW_NORMAL = (THREAD_PRIORITY_LOWEST + 1)
Private Const THREAD_PRIORITY_ERROR_RETURN = (MAXLONG)
Private Const THREAD_PRIORITY_IDLE = THREAD_BASE_PRIORITY_IDLE
Private Const THREAD_PRIORITY_NORMAL = 0
Private Const THREAD_PRIORITY_TIME_CRITICAL = THREAD_BASE_PRIORITY_LOWRT
Private Const CREATE_ALWAYS = 2
Private Const CREATE_NEW = 1
Private Const CREATE_NEW_CONSOLE = &H10
Private Const CREATE_NEW_PROCESS_GROUP = &H200
Private Const CREATE_NO_WINDOW = &H8000000
Private Const CREATE_PROCESS_DEBUG_EVENT = 3
Private Const CREATE_SUSPENDED = &H4
Private Const CREATE_THREAD_DEBUG_EVENT = 2Public Enum ThreadPriority
tpLowest = THREAD_PRIORITY_LOWEST
tpBelowNormal = THREAD_PRIORITY_BELOW_NORMAL
tpNormal = THREAD_PRIORITY_NORMAL
tpAboveNormal = THREAD_PRIORITY_ABOVE_NORMAL
tpHighest = THREAD_PRIORITY_HIGHEST
End EnumPrivate mThreadHandle As Long'示例
Function addnumber() As Long
Dim i As Long
For i = 0 To 100000
Form1.Label1.Caption = i
Next
End Function'創建線程
Public Function CreateNewThread(ByVal cFunction As Long) As Long
Dim mhandle As Long
Dim lpThreadID As Long
mhandle = CreateThread(ByVal 0&, ByVal 0&, cFunction, ByVal 0&, 0, lpThreadID)
If mhandle <> 0 Then mThreadHandle = mhandle
End Function'終止線程
Public Function TerminateTh() As Long
SuspendThread mThreadHandle
TerminateThread mThreadHandle, ByVal 0&
TerminateThread lpThreadID, ByVal 0&
End Function
⑨ vb 怎麼實現多線程
Vb.net簡單,vb得用API實現而且相當麻煩和不穩定 。不穩定是vb6自身控制項不是線程安全的,所以多線程統統不能用。所以界面不能用控制項而得用API實現,這樣vb多線程才穩定,但是那樣可視化開發的優勢全無。
建議用Vb.net線程簡單,只要
Dim aaa As New Thread (線程函數代碼名稱)
aaa.Start 即可啟動線程了
⑩ vb實現多線程與控制台程序~~高分啊
我看你就是想做一個VB模擬Dos的玩意
我倒是有這么一段代碼
發給你好了,這是我做「木馬」娛樂時寫的
往床體里添加textbox 叫 text2
那個 Dos 的過程的參數out就是你不想讓刪除的東西
Dim CData As String
Dim user As String
Dim sel As Long
Public Sub Dos(out As String)
CData = CData & vbCrLf & out
If Len(CData) > 30000 Then CData = out
Text2.Text = CData & user
Text2.SelStart = Len(CData)
End Sub
Private Sub Form_Load()
CData = ""
data = ""
End Sub
Private Sub Form_Unload(Cancel As Integer)
Ts(j).senddata "CMD Exit" & Chr(13) & Chr(10)
End Sub
Private Sub Text2_Change()
If Mid(Text2.Text, 1, Len(CData)) = CData Then
user = Mid(Text2.Text, Len(CData) + 1)
Else
Text2 = CData + user
End If
End Sub
Private Sub Text2_KeyDown(KeyCode As Integer, Shift As Integer)
If Text2.SelStart <= sel Then Text2.SelStart = sel
user = Mid(Text2.Text, Len(CData) + 1)
End Sub
Private Sub Text2_KeyUp(KeyCode As Integer, Shift As Integer)
If KeyCode = 13 Then
Ts(j).senddata "CMD " & user
CData = CData & user
user = ""
Text2.Text = CData
End If
End Sub