• Vui lòng đọc nội qui diễn đàn để tránh bị xóa bài viết
  • Tìm kiếm trước khi đặt câu hỏi

MultiThread in VB6

Các ví dụ nho nhỏ và những thứ linh tinh không thuộc nhóm nào
User avatar
truongphu
VIP
VIP
Posts: 4766
Joined: Sun 04/11/2007 10:57 am
Location: Cam Đức, Khánh hòa
Has thanked: 14 times
Been thanked: 520 times

MultiThread in VB6

Postby truongphu » Wed 19/08/2009 3:15 pm

Tên chương trình: MultiThread in VB6
Ngôn ngữ lập trình: VB6
Tác giả: Sưu tầm
Chức năng: Chạy nhiều tác vụ cùng lúc trong VB6
Đề tài nầy forum chúng ta chưa có
Xem code, thấy tác giả dùng các hàm Api như CreateThread, TerminateThread, GetCurrentThread...


untitled.JPG


Example sau đây khá hay
các bạn chịu khó load vì có 1 Form, 1 Module và 1 Class Module
Attachments
ThreadMulti.zip
(12.8 KiB) Downloaded 1246 times


o0o--truongphu--o0o

.........
Ghé thăm:
Chuyện Linh Tinh

User avatar
NoBi
Quản trị
Quản trị
Posts: 961
Joined: Tue 18/03/2008 1:22 pm
Location: Sài Gòn
Has thanked: 53 times
Been thanked: 66 times
Contact:

Re: MultiThread in VB6

Postby NoBi » Wed 19/08/2009 5:32 pm

Nghe nói dùng thread trong VB6 chơi thì được, còn làm 1 ứng dụng đoàng hoàng thì không ổn định vì dể sinh crash ứng dụng. Trước đây có thử đưa vào VBLib nhưng rồi phải gở ra, không biết có phải bị sai ở 1 công đoạn nào không?!.
:>

User avatar
alexanderdna
Guru
Guru
Posts: 214
Joined: Tue 14/07/2009 11:13 am
Location: Sài Gòn
Has thanked: 3 times
Been thanked: 15 times

Re: MultiThread in VB6

Postby alexanderdna » Mon 28/09/2009 9:02 am

AlexDNA đã tải chương trình về thử và thấy chạy tốt. Đem clsThreading qua chương trình mới mà dùng thì cũng hoạt động ổn. Có điều khi biên dịch và chạy thì chương trình bị sụp. AlexDNA đã tìm hiểu và thấy là phải biên dịch qua P-Code (trong Project Properties, thẻ Compile). Đó là kinh nghiệm của Alex, hy vọng giúp ích phần nào cho mọi người.

vuadapass
Thành viên chính thức
Thành viên chính thức
Posts: 15
Joined: Wed 26/03/2008 6:27 pm
Been thanked: 1 time

Re: MultiThread in VB6

Postby vuadapass » Sun 25/10/2009 1:10 pm

Nếu tạo thread nhảy thẳng tới một Address of {Function or Sub} trong VB6 thì sẽ sinh ra lỗi Crash khi ta compile nó ra và thread gọi một số hàm call thông qua VM của vb6. Cái trên của anh là thuần code, nếu anh thêm một lệnh call tới api sẽ sinh ra crash ngay, giả dụ như Msgbox ...
nếu muốn tạo dựng một tác vụ vb6 multi-threading theo em có thể xài ocx, activex rồi từ đó load lên nhiều object cùng một lúc (em đã thử ok)
hoặc nếu muốn sử dụng CreateThread mà không bị crash thì phải pha chộn thêm tý ngôn ngữ khác vào (asm -> bytecode rồi tạo một thread chạy đoạn bytecode nói trên). Cái này yêu cầu phải biết thêm asm.

User avatar
truongphu
VIP
VIP
Posts: 4766
Joined: Sun 04/11/2007 10:57 am
Location: Cam Đức, Khánh hòa
Has thanked: 14 times
Been thanked: 520 times

Re: MultiThread in VB6

Postby truongphu » Thu 10/12/2009 3:33 pm

vuadapass wrote:Nếu tạo thread nhảy thẳng tới một Address of {Function or Sub} trong VB6 thì sẽ sinh ra lỗi Crash khi ta compile nó ra và thread gọi một số hàm call thông qua VM của vb6.


Tôi có một vòng lặp vô tận như sau:
  1. Private Function VôTân() As Long
  2. Dim i As Long
  3.     Do While i > 0
  4.         'DoEvents '<- Khóa tác dung
  5.        If i > 1000000 Then i = 1
  6.         i = i + 1
  7.         VôTân = i
  8.     Loop
  9. End Function


Như các bạn thấy, lệnh DoEvents bị khóa
Nếu project hay Application nào gọi vòng lặp vô tận trên, đương nhiên bị treo máy

Bây giờ, Code sau sẽ tạo ra các thread chạy độc lập: Command2 thì gọi vòng lặp vô tận, command1 gọi taskmanager. Các bạn thử xem: chúng sẽ chạy vô tư, không treo máy:

[vb]Option Explicit
Const INFINITE As Long = -1
Private Type PROCESS_INFORMATION
hProcess As Long
hThread As Long
dwProcessId As Long
dwThreadId As Long
End Type
Private Type STARTUPINFOW
cbSize As Long
lpReserved As Long
lpDesktop As Long
lpTitle As Long
dwX As Long
dwY As Long
dwXSize As Long
dwYSize As Long
dwXCountChars As Long
dwYCountChars As Long
dwFillAttribute As Long
dwFlags As Long
wShowWindow As Integer
cbReserved2 As Integer
lpReserved2 As Long
hStdInput As Long
hStdOutput As Long
hStdError As Long
End Type

Private Declare Function apiCreateProcess Lib _
"kernel32" Alias "CreateProcessW" _
(ByVal lpApplicationName As Long, _
ByVal lpCommandLine As Long, _
ByRef lpProcessAttributes As Long, _
ByRef lpThreadAttributes As Long, _
ByVal bInheritHandles As Long, _
ByVal dwCreationFlags As Long, _
ByRef lpEnvironment As Long, _
ByVal lpCurrentDirectory As Long, _
ByRef lpStartupInfo As STARTUPINFOW, _
ByRef lpProcessInformation As PROCESS_INFORMATION) As Long

Private Declare Function apiWaitForSingleObject Lib _
"kernel32" Alias "WaitForSingleObject" _
(ByVal hHandle As Long, _
ByVal dwMilliseconds As Long) As Long

Private Declare Function apiCloseHandle Lib _
"kernel32" Alias "CloseHandle" _
(ByVal hObject As Long) As Long

Private Sub Command1_Click()
Call StartProcess("c:\windows\system32\taskmgr.exe")
End Sub

Public Function StartProcess(ByVal sPath As String, Optional ByVal shwError As Boolean = False) As Long
On Error Resume Next
Dim psi As STARTUPINFOW
Dim pInfo As PROCESS_INFORMATION
psi.cbSize = Len(psi)
psi.lpTitle = StrPtr("Default") 'desktop name!!!
psi.lpDesktop = StrPtr("Default")
StartProcess = apiCreateProcess _
(StrPtr(sPath), ByVal 0, ByVal 0, ByVal 0, 1, 0, ByVal 0, ByVal 0, psi, pInfo)
If StartProcess <> 0 Then
'Wait until the process has completed
Call apiWaitForSingleObject(pInfo.hProcess, INFINITE)
apiCloseHandle (pInfo.hProcess)
apiCloseHandle (pInfo.hThread)
End If
If StartProcess = 0 And shwError = True Then
MsgBox ("Process not created")
End If
End Function

Private Function VôTân() As Long
Dim i As Long
Do While i > 0
'DoEvents
If i > 1000000 Then i = 1
i = i + 1
VôTân = i
Loop
End Function

Private Sub Command2_Click()
StartProcess VôTân
End Sub
[/vb]

Project bên dưới có biên dịch thành exe để test thử theo lời bạn vuadapass
Attachments
CreateProcess 2 thread.rar
(5.17 KiB) Downloaded 659 times
o0o--truongphu--o0o

.........
Ghé thăm:
Chuyện Linh Tinh

ntc376
Posts: 2
Joined: Thu 21/06/2012 12:18 pm
Been thanked: 1 time

Re: MultiThread in VB6

Postby ntc376 » Thu 21/06/2012 12:23 pm

Bác TruongPhu rãnh ghê. i=0 thì có vào được vòng lặp đâu mà treo máy
"

Private Function VôTân() As Long
Dim i As Long
Do While i > 0
'DoEvents
If i > 1000000 Then i = 1
i = i + 1
VôTân = i
Text1.Text = Str(i)
Me.Refresh
Loop

End Function
"

thinh18tt
Mạnh Thường Quân
Mạnh Thường Quân
Posts: 167
Joined: Tue 18/05/2010 11:49 pm
Has thanked: 7 times

Re: MultiThread in VB6

Postby thinh18tt » Mon 10/06/2013 4:03 pm

Bác truongphu ơi, em tải CreateProcess 2 thread của bác về, gán i=1 trước vòng lặp và khi chạy Command2 rồi bấm Command1 thì bị Not responding. Bác xem lại nhé!


Return to “[VB] Mã nguồn linh tinh”

Who is online

Users browsing this forum: No registered users and 0 guests