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

Các thủ thuật liên quan đến xử lý chuỗi và thời gian
Post Reply
User avatar
xuanha
Guru
Guru
Posts: 1230
Joined: Thu 19/08/2010 4:25 pm
Location: Ban Tổ chức Thành uỷ Hưng Yên, tỉnh Hưng Yên
Has thanked: 13 times
Been thanked: 374 times
Contact:

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

Post by 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

Code: Select all

Private Sub Form_Click()
Dim i%
Do
Me.Caption = Now: DoEvents
Loop Until i > 0
End Sub
Kiểm phiếu Đại hội Đoàn, Đại hội Đảng
http://caulacbovb.com/forum/viewtopic.php?t=23599
User avatar
truongphu
VIP
VIP
Posts: 4781
Joined: Sun 04/11/2007 10:57 am
Location: Cam Đức, Khánh hòa
Has thanked: 14 times
Been thanked: 525 times

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

Post by truongphu »

xuanha wrote:

Code: Select all

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 :(
o0o--truongphu--o0o

.........
Ghé thăm:
Chuyện Linh Tinh
User avatar
xuanha
Guru
Guru
Posts: 1230
Joined: Thu 19/08/2010 4:25 pm
Location: Ban Tổ chức Thành uỷ Hưng Yên, tỉnh Hưng Yên
Has thanked: 13 times
Been thanked: 374 times
Contact:

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

Post by xuanha »

truongphu wrote: 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
Last edited by xuanha on Tue 25/09/2012 10:18 pm, edited 1 time in total.
Kiểm phiếu Đại hội Đoàn, Đại hội Đảng
http://caulacbovb.com/forum/viewtopic.php?t=23599
User avatar
VuVanHoanh
Thành viên danh dự
Thành viên danh dự
Posts: 1259
Joined: Thu 03/06/2010 9:23 pm
Location: Kim Sơn - Đông Triều - Quảng Ninh
Has thanked: 22 times
Been thanked: 138 times
Contact:

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

Post by 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.
Since 2008...
One love! :x
dtbinhtomay
Posts: 1
Joined: Wed 20/05/2009 8:44 pm

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

Post by 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
User avatar
dazzlingvit
Guru
Guru
Posts: 960
Joined: Tue 18/01/2011 10:21 am
Location: Sinh ra từ hư vô, sống trong thế giới ảo...
Has thanked: 7 times
Been thanked: 112 times
Contact:

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

Post by dazzlingvit »

xuanha wrote:
truongphu wrote: 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?
Dazzling V.I.T
Hãy gọi tôi là vịt :)
User avatar
xuanha
Guru
Guru
Posts: 1230
Joined: Thu 19/08/2010 4:25 pm
Location: Ban Tổ chức Thành uỷ Hưng Yên, tỉnh Hưng Yên
Has thanked: 13 times
Been thanked: 374 times
Contact:

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

Post by xuanha »

dazzlingvit wrote: 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 wrote: 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.
Kiểm phiếu Đại hội Đoàn, Đại hội Đảng
http://caulacbovb.com/forum/viewtopic.php?t=23599
User avatar
dazzlingvit
Guru
Guru
Posts: 960
Joined: Tue 18/01/2011 10:21 am
Location: Sinh ra từ hư vô, sống trong thế giới ảo...
Has thanked: 7 times
Been thanked: 112 times
Contact:

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

Post by 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?
Dazzling V.I.T
Hãy gọi tôi là vịt :)
User avatar
xuanha
Guru
Guru
Posts: 1230
Joined: Thu 19/08/2010 4:25 pm
Location: Ban Tổ chức Thành uỷ Hưng Yên, tỉnh Hưng Yên
Has thanked: 13 times
Been thanked: 374 times
Contact:

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

Post by 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
Kiểm phiếu Đại hội Đoàn, Đại hội Đảng
http://caulacbovb.com/forum/viewtopic.php?t=23599
User avatar
dazzlingvit
Guru
Guru
Posts: 960
Joined: Tue 18/01/2011 10:21 am
Location: Sinh ra từ hư vô, sống trong thế giới ảo...
Has thanked: 7 times
Been thanked: 112 times
Contact:

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

Post by 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
Dazzling V.I.T
Hãy gọi tôi là vịt :)
User avatar
VuVanHoanh
Thành viên danh dự
Thành viên danh dự
Posts: 1259
Joined: Thu 03/06/2010 9:23 pm
Location: Kim Sơn - Đông Triều - Quảng Ninh
Has thanked: 22 times
Been thanked: 138 times
Contact:

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

Post by 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
Since 2008...
One love! :x
KIDLINUX
Thành viên chính thức
Thành viên chính thức
Posts: 13
Joined: Thu 27/03/2008 10:52 am
Has thanked: 7 times

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

Post by 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
Romeo8x
Thành viên chính thức
Thành viên chính thức
Posts: 23
Joined: Fri 18/04/2008 5:49 pm
Has thanked: 2 times
Been thanked: 14 times

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

Post by 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
User avatar
truongphu
VIP
VIP
Posts: 4781
Joined: Sun 04/11/2007 10:57 am
Location: Cam Đức, Khánh hòa
Has thanked: 14 times
Been thanked: 525 times

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

Post by truongphu »

dtbinhtomay wrote: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
o0o--truongphu--o0o

.........
Ghé thăm:
Chuyện Linh Tinh
User avatar
dazzlingvit
Guru
Guru
Posts: 960
Joined: Tue 18/01/2011 10:21 am
Location: Sinh ra từ hư vô, sống trong thế giới ảo...
Has thanked: 7 times
Been thanked: 112 times
Contact:

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

Post by 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 :
Dazzling V.I.T
Hãy gọi tôi là vịt :)
User avatar
01632911829
Thành viên chính thức
Thành viên chính thức
Posts: 42
Joined: Sat 11/08/2012 12:50 pm
Location: Bình Thuận
Has thanked: 4 times
Been thanked: 2 times
Contact:

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

Post by 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

Code: Select all

label1.caption = now
Ko dùng timer chi cho khổ.. Có gì chỉ giáo nha
ducthaodt
Posts: 6
Joined: Fri 29/04/2011 8:01 pm

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

Post by 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.
User avatar
NTN
Thành viên tâm huyết
Thành viên tâm huyết
Posts: 491
Joined: Wed 05/02/2014 3:43 pm
Location: Đồng Tháp,Việt Nam
Has thanked: 20 times
Been thanked: 7 times
Contact:

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

Post by NTN »

MÌnh thấy sử dụng Timer dễ hơn á !

Code: Select all

Label1.caption = Date
Label2.caption = Time
MinhAnVanMan
Posts: 9
Joined: Fri 28/08/2020 1:29 pm
Been thanked: 1 time

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

Post by MinhAnVanMan »

Mục đích của topic là giúp mọi người biết thêm là có thể lấy giờ hệ thống mà không dùng Timer và hàm API. Chỉ thế thôi. Còn vấn đế áp dụng nó như thế nào và chọn nó hay không là tùy ở mỗi người.Mỗi cá nhân có cách để lấy giờ hệ thống khác nhau. Miễn sao thấy tiện là OK rồi.
Post Reply

Return to “[VB] Chuỗi và Thời gian”