CreateThread của mình chạy được như sao đóng không được vậy? (1 người xem)

Liên hệ QC

Người dùng đang xem chủ đề này

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.
 

File đính kèm

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.

Cụ thể là bạn muốn làm cái gì? Mô tả luôn đi. Xem code làm biếng lắm
 
Upvote 0
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.
 
Upvote 0
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.

Nếu muốn làm việc với timer bạn nên dùng hàm API setTimer sẽ an toàn hơn dùng Thread.
 
Upvote 0
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.

Nói tóm lại: Bạn muốn làm cái đồng hồ trên Label, đúng không?
Lòng vòng quá
 
Upvote 0
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.
 
Upvote 0
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.

Làm như sau:
1> Code trong Module
Mã:
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
2> Code trong UserForm1
Mã:
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
Đại khái thế
 

File đính kèm

Upvote 0
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ắt
API 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 đỡ.
 

File đính kèm

Lần chỉnh sửa cuối:
Upvote 0
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ắt
API 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 đỡ.

Với EnableCancelKey, SetTimer, OnTimer thì không có luồng mới nào được tạo. Code của chúng (Do ... Loop, TimerProc, OnTimeProc) đều được thực hiện trong primary thread. Nếu code thực hiện lâu vd. các tính toán lâu thì sẽ không làm được gì vd. trên sheet trong suốt quá trình code thực hiện.
Chính vì thế có những việc không thể dùng đơn giản SetTimer được.

----------------------
Góp vui
CreateThread với truyền Parameter

Sau khi Run thì mở nhiều phần mềm vd. notepad, firefox, Internet Explorer, Word, thư mục ...
 

File đính kèm

Lần chỉnh sửa cuối:
Upvote 0
Web KT

Bài viết mới nhất

Back
Top Bottom