Trang 1 trên 1

Lấy ngày giờ hệ thống không dùng Timer, không dùng hàm API

Đã gửi: T.Năm 20/09/2012 10:05 pm
gửi bởi xuanha
Thủ thuật: Lấy ngày giờ hệ thống không dùng Timer, không dùng hàm API
Tác giả: XuanHa
Mô tả: Lấy ngày giờ hệ thống không dùng Timer, không dùng hàm API


Mã: Chọn hết

Private Sub Form_Click()
Dim i%
Do
Me.Caption = Now: DoEvents
Loop Until i > 0
End Sub

Re: Lấy ngày giờ hệ thống không dùng Timer, không dùng hàm A

Đã gửi: T.Sáu 21/09/2012 8:20 am
gửi bởi truongphu
xuanha đã viết:

Mã: Chọn hết

Private Sub Form_Click()
Dim i%
Do
Me.Caption = Now: DoEvents
Loop Until i > 0
End Sub


Sao tôi đọc code mà chẳng hiểu tí gì? :-O
Mong tác giả giải thích rõ thêm :(

Re: Lấy ngày giờ hệ thống không dùng Timer, không dùng hàm A

Đã gửi: T.Sáu 21/09/2012 9:18 am
gửi bởi xuanha
truongphu đã viết:Sao tôi đọc code mà chẳng hiểu tí gì? :-O
Mong tác giả giải thích rõ thêm :(


Bác lại cười em rồi! Em xin giải thích về ý ngĩa của đoạn code trên
Dim i%: i có giá trị bằng 0
Do
Me.Caption = Now: DoEvents
Loop Until i > 0: Kết thúc khi i có giá trị lớn hơn không (điều này sẽ không bao giờ xảy ra với đoạn code này do, vậy vòng lặp luôn luôn được thực hiện, đồng thời sẽ caption của form luôn luôn = Now ở thời điểm hiện tại).

Với vòng lặp trên thì cũng không cần phải sử dụng biến i, có thể làm như sau:
Do
Me.Caption = Now: DoEvents
Loop Until len(Now)= 0

Và dưới đây là đoạn code dòng chữ chạy em làm trên Word
  1. Dim x$, i@
  2. Private Sub Document_Open()
  3. x = "Nguyễn Xuân Hà, Cán bộ Ban Tổ chức Thành uỷ Hưng Yên, tỉnh Hưng Yên __ "
  4. Do
  5. i = i + 1
  6. If i = 30000 Then
  7. x = Mid(x, 2) & Left(x, 1)
  8. Application.Caption = x
  9. i = 0
  10. End If
  11. DoEvents
  12. Loop Until Len(Now) = 0

Re: Lấy ngày giờ hệ thống không dùng Timer, không dùng hàm A

Đã gửi: T.Bảy 22/09/2012 1:41 pm
gửi bởi VuVanHoanh
à, một dạng Timer...
chỉ có điều tiêu đề bạn viết sai mục đích của bài viết rồi.

Re: Lấy ngày giờ hệ thống không dùng Timer, không dùng hàm A

Đã gửi: T.Ba 25/09/2012 9:57 pm
gửi bởi dtbinhtomay
Code đơn giản mà hiệu quả nhỉ?
như vậy không cần biến i làm gì cho dài dòng
Private Sub Form_Click()
Do
Me.Caption = Now: DoEvents
Loop
End Sub

Re: Lấy ngày giờ hệ thống không dùng Timer, không dùng hàm A

Đã gửi: T.Tư 26/09/2012 6:03 pm
gửi bởi dazzlingvit
xuanha đã viết:
truongphu đã viết:Sao tôi đọc code mà chẳng hiểu tí gì? :-O
Mong tác giả giải thích rõ thêm :(


Bác lại cười em rồi! Em xin giải thích về ý ngĩa của đoạn code trên
Dim i%: i có giá trị bằng 0
Do
Me.Caption = Now: DoEvents
Loop Until i > 0: Kết thúc khi i có giá trị lớn hơn không (điều này sẽ không bao giờ xảy ra với đoạn code này do, vậy vòng lặp luôn luôn được thực hiện, đồng thời sẽ caption của form luôn luôn = Now ở thời điểm hiện tại).

Với vòng lặp trên thì cũng không cần phải sử dụng biến i, có thể làm như sau:
Do
Me.Caption = Now: DoEvents
Loop Until len(Now)= 0

Và dưới đây là đoạn code dòng chữ chạy em làm trên Word
  1. Dim x$, i@
  2. Private Sub Document_Open()
  3. x = "Nguyễn Xuân Hà, Cán bộ Ban Tổ chức Thành uỷ Hưng Yên, tỉnh Hưng Yên __ "
  4. Do
  5. i = i + 1
  6. If i = 30000 Then
  7. x = Mid(x, 2) & Left(x, 1)
  8. Application.Caption = x
  9. i = 0
  10. End If
  11. DoEvents
  12. Loop Until Len(Now) = 0

Trong quá trình thực hiện cái này, chương trình cũng đứng im luôn à? Nếu thế thì có ích gì ở đây?

Re: Lấy ngày giờ hệ thống không dùng Timer, không dùng hàm A

Đã gửi: T.Năm 27/09/2012 10:09 am
gửi bởi xuanha
dazzlingvit đã viết:Trong quá trình thực hiện cái này, chương trình cũng đứng im luôn à? Nếu thế thì có ích gì ở đây?

Mình chạy nó có bị sao đâu.
dazzlingvit đã viết:Nếu thế thì có ích gì ở đây?

Về lợi ích thì tuỳ thuộc vào mỗi người sử dụng để làm gì, áp dụng vào đâu, biến đổi như thế nào.
dazzlingvit không thấy ích lợi gì thì không cần phải tìm hiểu cho phí thời gian.

Re: Lấy ngày giờ hệ thống không dùng Timer, không dùng hàm A

Đã gửi: T.Năm 27/09/2012 5:33 pm
gửi bởi dazzlingvit
Vậy bạn xuanha thử ví dụ một ứng dụng của cái này xem. Ít nhất khi mình nhìn thấy vòng lặp như thế kia thì chương trình xử lý vào đâu?

Re: Lấy ngày giờ hệ thống không dùng Timer, không dùng hàm A

Đã gửi: T.Năm 27/09/2012 10:08 pm
gửi bởi xuanha
Đoạn code sau dùng cho VB6
  1. Option Explicit
  2. Dim t As Boolean
  3. Private Sub Form_Activate()
  4. Do
  5. Label1.Caption = Now: DoEvents
  6. Loop Until t = True
  7. End Sub
  8.  
  9. Private Sub Form_Unload(Cancel As Integer)
  10. t = True
  11. End Sub
  12.  

Re: Lấy ngày giờ hệ thống không dùng Timer, không dùng hàm A

Đã gửi: T.Sáu 28/09/2012 12:00 am
gửi bởi dazzlingvit
Cơ mà lặp như thế này ngốn tài nguyên vô cùng (vì lúc nào nó cũng chạy xoành xoạch xoành xoạch cái vòng lặp kia). Nếu bạn xuanha không muốn dùng Timer có thể dùng vòng lặp, nhưng không phải theo cách này :)
Bạn cần thêm hàm Sleep để mỗi khi cập nhật xong thời gian mới, nó tự "ngủ" một thời gian nhất định (1s hoặc 500ms tuỳ thích). Ngủ ở đây khác hẳn với việc chạy hùng hục một vòng lặp nhé.
Mặc dù không chính xác lắm nhưng có thể cải tiến cái của bạn như sau:
  1. Option Explicit
  2. Private Declare Sub Sleep Lib "kernel32.dll" (ByVal dwMilliseconds As Long)
  3. Dim t As Boolean
  4. Private Sub Form_Activate()
  5. Do
  6. Label1.Caption = Now: DoEvents
  7. Sleep 500
  8. Loop Until t = True
  9. End Sub
  10.  
  11. Private Sub Form_Unload(Cancel As Integer)
  12. t = True
  13. End Sub
  14.  

Re: Lấy ngày giờ hệ thống không dùng Timer, không dùng hàm A

Đã gửi: T.Sáu 28/09/2012 1:29 pm
gửi bởi VuVanHoanh
cái code trên hình như cũng đơ luôn form vì đơn luồng + Sleep...

~~~~
viewtopic.php?f=52&t=8901&p=126284

Re: Lấy ngày giờ hệ thống không dùng Timer, không dùng hàm A

Đã gửi: T.Ba 16/10/2012 10:31 am
gửi bởi KIDLINUX
Cũng là ý hay nhưng thấy không ổn lắm, vì nó sẽ chạy mãi không có thời gian ngơi nghỉ
Dùng Timer thấy ổn hơn bạn ơi

Re: Lấy ngày giờ hệ thống không dùng Timer, không dùng hàm A

Đã gửi: T.Ba 13/11/2012 5:06 pm
gửi bởi Romeo8x
Vứt 1 cái Timer vào so với việc cho vòng lặp nó chạy liên tục trong suốt quá trình chạy chương trình thì cái nào chiếm tài nguyên hệ thông hơn :D

Re: Lấy ngày giờ hệ thống không dùng Timer, không dùng hàm A

Đã gửi: T.Sáu 21/12/2012 9:44 am
gửi bởi truongphu
dtbinhtomay đã viết:Do
Me.Caption = Now: DoEvents
Loop


Dùng vòng lặp vô hạn là điều nên tránh trng sử dụng code vì sẽ chiếm dụng cpu, cho dù ta có thêm lệnh DoEvents.

Để đạt được cùng mục đích mà không dùng Timer, không dùng vòng lặp vô hạn, không dùng hàm API, ta có thể viết như sau:

  1. Private Sub Form_MouseMove(Button As Integer, Shift As Integer, X As Single, Y As Single)
  2.     Static ZZ As Date: ZZ = Now
  3.     If Now > ZZ Then ZZ = Date
  4.     Me.Caption = ZZ
  5. End Sub


Code trên sẽ đáp ứng rất nhẹ nhàng.

Chúc mừng Giáng Sinh

Re: Lấy ngày giờ hệ thống không dùng Timer, không dùng hàm A

Đã gửi: T.Bảy 22/12/2012 10:11 pm
gửi bởi dazzlingvit
Thực tế khi mình di chuyển chuột liên tục thì cái hàm kia của bác sẽ chạy liên tục mà. Cháu nghĩ nó không làm chậm máy nhưng kể ra nó cũng tốn kém tài nguyên đấy :)
Hơn nữa nếu người dùng để im không di chuột thì nó sẽ không chạy :

Re: Lấy ngày giờ hệ thống không dùng Timer, không dùng hàm A

Đã gửi: CN 30/12/2012 7:26 pm
gửi bởi 01632911829
Tạo 1 lable1 và 1timer. Chỉnh interval timer là 100
cho code này vào là ok thuj. Đơn giản ít tốn tài nguyên

Mã: Chọn hết

label1.caption = now


Ko dùng timer chi cho khổ.. Có gì chỉ giáo nha

Re: Lấy ngày giờ hệ thống không dùng Timer, không dùng hàm A

Đã gửi: T.Năm 27/03/2014 11:15 am
gửi bởi ducthaodt
Tại sao mọi người cứ bàn về vấn đề mã nguồn này nhỉ, nếu các bạn dùng mã này thì sẽ tốn tài nguyên và các lệnh sau nó sẽ không thể thực hiện được vì chương trình luôn luôn chạy vòng lập mà không thể thoát ra để sử lí tiếp chương trình khác được, vì đây là đơn nhiệm, nếu cố tình dùng thì hãy tìm hiểu hàm thread, trong khi đó Microsoft đã cung cấp timer rât hiệu nghiệm mà ta lại không dùng , có phải là mất thời gian không các bạn. Nếu các bạn làm cho công ty nào đó mà cứ loay hoay mấy cái mã lệnh kiểu này thì sớm muộn thì cũng phá sản thôi.

Re: Lấy ngày giờ hệ thống không dùng Timer, không dùng hàm A

Đã gửi: T.Năm 24/04/2014 7:07 am
gửi bởi NTN
MÌnh thấy sử dụng Timer dễ hơn á !

Mã: Chọn hết

Label1.caption = Date
Label2.caption = Time