• 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
Hình đại diện của người dùng
truongphu
VIP
VIP
Bài viết: 4756
Ngày tham gia: CN 04/11/2007 10:57 am
Đến từ: Cam Đức, Khánh hòa
Has thanked: 14 time
Been thanked: 509 time

MultiThread in VB6

Gửi bàigửi bởi truongphu » T.Tư 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
Tập tin đính kèm
ThreadMulti.zip
(12.8 KiB) Đã tải 1095 lần


o0o--truongphu--o0o

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

Hình đại diện của người dùng
NoBi
Quản trị
Quản trị
Bài viết: 945
Ngày tham gia: T.Ba 18/03/2008 1:22 pm
Đến từ: Sài Gòn
Has thanked: 50 time
Been thanked: 66 time
Liên hệ:

Re: MultiThread in VB6

Gửi bàigửi bởi NoBi » T.Tư 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?!.
:>

Hình đại diện của người dùng
alexanderdna
Guru
Guru
Bài viết: 214
Ngày tham gia: T.Ba 14/07/2009 11:13 am
Đến từ: Sài Gòn
Has thanked: 3 time
Been thanked: 15 time

Re: MultiThread in VB6

Gửi bàigửi bởi alexanderdna » T.Hai 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
Bài viết: 15
Ngày tham gia: T.Tư 26/03/2008 6:27 pm
Been thanked: 1 time

Re: MultiThread in VB6

Gửi bàigửi bởi vuadapass » CN 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.

Hình đại diện của người dùng
truongphu
VIP
VIP
Bài viết: 4756
Ngày tham gia: CN 04/11/2007 10:57 am
Đến từ: Cam Đức, Khánh hòa
Has thanked: 14 time
Been thanked: 509 time

Re: MultiThread in VB6

Gửi bàigửi bởi truongphu » T.Năm 10/12/2009 3:33 pm

vuadapass đã viết: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:

  1. Option Explicit
  2. Const INFINITE As Long = -1
  3. Private Type PROCESS_INFORMATION
  4.    hProcess As Long
  5.    hThread As Long
  6.    dwProcessId As Long
  7.    dwThreadId As Long
  8. End Type
  9. Private Type STARTUPINFOW
  10.    cbSize As Long
  11.    lpReserved As Long
  12.    lpDesktop As Long
  13.    lpTitle As Long
  14.    dwX As Long
  15.    dwY As Long
  16.    dwXSize As Long
  17.    dwYSize As Long
  18.    dwXCountChars As Long
  19.    dwYCountChars As Long
  20.    dwFillAttribute As Long
  21.    dwFlags As Long
  22.    wShowWindow As Integer
  23.    cbReserved2 As Integer
  24.    lpReserved2 As Long
  25.    hStdInput As Long
  26.    hStdOutput As Long
  27.    hStdError As Long
  28. End Type
  29.  
  30. Private Declare Function apiCreateProcess Lib _
  31. "kernel32" Alias "CreateProcessW" _
  32. (ByVal lpApplicationName As Long, _
  33. ByVal lpCommandLine As Long, _
  34. ByRef lpProcessAttributes As Long, _
  35. ByRef lpThreadAttributes As Long, _
  36. ByVal bInheritHandles As Long, _
  37. ByVal dwCreationFlags As Long, _
  38. ByRef lpEnvironment As Long, _
  39. ByVal lpCurrentDirectory As Long, _
  40. ByRef lpStartupInfo As STARTUPINFOW, _
  41. ByRef lpProcessInformation As PROCESS_INFORMATION) As Long
  42.  
  43. Private Declare Function apiWaitForSingleObject Lib _
  44. "kernel32" Alias "WaitForSingleObject" _
  45. (ByVal hHandle As Long, _
  46. ByVal dwMilliseconds As Long) As Long
  47.  
  48. Private Declare Function apiCloseHandle Lib _
  49. "kernel32" Alias "CloseHandle" _
  50. (ByVal hObject As Long) As Long
  51.  
  52. Private Sub Command1_Click()
  53.    Call StartProcess("c:\windows\system32\taskmgr.exe")
  54. End Sub
  55.  
  56. Public Function StartProcess(ByVal sPath As String, Optional ByVal shwError As Boolean = False) As Long
  57.    On Error Resume Next
  58.    Dim psi As STARTUPINFOW
  59.    Dim pInfo As PROCESS_INFORMATION
  60.    psi.cbSize = Len(psi)
  61.    psi.lpTitle = StrPtr("Default") 'desktop name!!!
  62.   psi.lpDesktop = StrPtr("Default")
  63.    StartProcess = apiCreateProcess _
  64.    (StrPtr(sPath), ByVal 0, ByVal 0, ByVal 0, 1, 0, ByVal 0, ByVal 0, psi, pInfo)
  65.    If StartProcess <> 0 Then
  66.       'Wait until the process has completed
  67.      Call apiWaitForSingleObject(pInfo.hProcess, INFINITE)
  68.       apiCloseHandle (pInfo.hProcess)
  69.       apiCloseHandle (pInfo.hThread)
  70.    End If
  71.    If StartProcess = 0 And shwError = True Then
  72.       MsgBox ("Process not created")
  73.    End If
  74. End Function
  75.  
  76. Private Function VôTân() As Long
  77. Dim i As Long
  78.     Do While i > 0
  79.         'DoEvents
  80.        If i > 1000000 Then i = 1
  81.         i = i + 1
  82.         VôTân = i
  83.     Loop
  84. End Function
  85.  
  86. Private Sub Command2_Click()
  87.     StartProcess VôTân
  88. End Sub
  89.  


Project bên dưới có biên dịch thành exe để test thử theo lời bạn vuadapass
Tập tin đính kèm
CreateProcess 2 thread.rar
(5.17 KiB) Đã tải 542 lần
o0o--truongphu--o0o

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

ntc376
Bài viết: 2
Ngày tham gia: T.Năm 21/06/2012 12:18 pm
Been thanked: 1 time

Re: MultiThread in VB6

Gửi bàigửi bởi ntc376 » T.Năm 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
Bài viết: 167
Ngày tham gia: T.Ba 18/05/2010 11:49 pm
Has thanked: 7 time

Re: MultiThread in VB6

Gửi bàigửi bởi thinh18tt » T.Hai 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é!


Quay về “[VB] Mã nguồn linh tinh”

Đang trực tuyến

Đang xem chuyên mục này: Không có thành viên nào trực tuyến.1 khách