minhhai309
Thành viên mới

- Tham gia
- 11/3/14
- Bài viết
- 5
- Được thích
- 0
Chào mọi người, mình đang thử tạo CreateThread nhưng mình không thể tắt được nó. Bạn nào rành về nó cho mình xin ý kiến được không?
Cảm ơn bạn nhiều.
mình chỉ muốn thử gọi CreateThread cho hàm iTimeL tự động cập nhật thời gian cho label thui.
hnd = CreateThread(0, 2000, AddressOf iTimeL, threadparam, 0, threadid)
với iTimeL trong Module:
Public Function iTimeL()
UserForm1.Label1.Caption = Format(Now(), "hh:mm:ss")
If t Then
'Application.OnTime Now() + TimeValue("00:00:01"), "iTimeL" <~~ dòng này cũng ko có tác dụng trong CreateThread
Sleep (1000)
Call iTimeL
End If
End Function
nhưng khi dừng lại thì "CloseHandle hnd" lại làm from bị treo.
Mình không biết phải làm sao nữa.
mình chỉ muốn thử gọi CreateThread cho hàm iTimeL tự động cập nhật thời gian cho label thui.
hnd = CreateThread(0, 2000, AddressOf iTimeL, threadparam, 0, threadid)
với iTimeL trong Module:
Public Function iTimeL()
UserForm1.Label1.Caption = Format(Now(), "hh:mm:ss")
If t Then
'Application.OnTime Now() + TimeValue("00:00:01"), "iTimeL" <~~ dòng này cũng ko có tác dụng trong CreateThread
Sleep (1000)
Call iTimeL
End If
End Function
nhưng khi dừng lại thì "CloseHandle hnd" lại làm from bị treo.
Mình không biết phải làm sao nữa.
vâng, nhưng mình muốn nó chạy chìm bên dưới. Để không có hiện tượng chớp hoặc ngăn chặn các lệnh khác khi From đang hoạt động Proccessing của from.
Private Declare Function SetTimer Lib "user32" (ByVal hWnd As Long, ByVal nIDEvent As Long, ByVal uElapse As Long, ByVal lpTimerFunc As Long) As Long
Private Declare Function KillTimer Lib "user32" (ByVal hWnd As Long, ByVal nIDEvent As Long) As Long
Function TimeProc(ByVal H As Long, ByVal nMSG As Long, ByVal nID As Long, ByVal nTsys As Long)
UserForm1.Label1.Caption = Format(Now, "hh:mm:ss")
End Function
Sub StartTimer()
On Error Resume Next
StopTimer
SetTimer Application.hWnd, 1, 100, AddressOf TimeProc
End Sub
Sub StopTimer()
On Error Resume Next
KillTimer Application.hWnd, 1
End Sub
Private Sub CommandButton2_Click()
With Me.CommandButton2
Run IIf(.Caption = "Start", "StartTimer", "StopTimer")
.Caption = IIf(.Caption = "Start", "Stop", "Start")
End With
End Sub
Private Sub UserForm_Initialize()
Me.CommandButton2.Caption = "Stop"
StartTimer
End Sub
Private Sub UserForm_Terminate()
StopTimer
End Sub
Sau nhiều ngày mình lên các diễn đàn. Mình tóm lược được một số cách chạy đa luồng như sau:
+Dùng EnableCancelKey để khóa phần can thiệp bắt lỗi.
Application.EnableCancelKey = [xlErrorHandler/xlDisabled]
+Dùng OnTime để chạy trên cả nền chạy đơn luồng, bắt 1 sự kiện thời gian được ghi nhận từ trước
Application.OnTime Now() + TimeSerial(0, 0, 1), "iTimeL2"
+Dùng SetTimer/KillTimer để bắtAPI timers của máy, gần giống với OnTime
SetTimer Application.hwnd, 199, 1000, AddressOf iTimeL3
KillTimer Application.hwnd, 199
+và cuối cùng là CreateThread, hoàn toàn tạo ra một luồng mới.
hThread = CreateThread(ByVal 0&, ByVal 0&, AddressOf iTimeL4, 0&, ByVal 0&, 0&)
CloseHandle hThread
xin cảm ơn các bạn đã giúp đỡ.