Cho mình hỏi về hàm Sleep với !

glasseggs

New Member
Hội viên mới
Mình có tạo 1 nút lệnh để thực hiện backup dữ liệu ,trong phần đầu code của nút này mình mở 1 cái Form (Form này sau khi mở sẽ đóng sau 1/10 của giây và có thực hiện 1 số lệnh sau khi đóng)

Và mình muốn hỏi đoạn code của nút đó sau khi thực hiện mở Form ,mình muốn các đoạn code tiếp sau sẽ dừng lại khoảng 1/2 giây có được không .
Mình có dùng hàm Sleep nhưng có vẻ nó ngưng hoạt động của toàn bộ phần mềm thì phải, mà mình chỉ muốn ngưng thực hiện đoạn code trong cái nút kia thôi .
Code hàm sleep như sau :

Mã:
 Public Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)

Sau đó mình gọi hàm Sleep(500)

Ví dụ thế này cho dễ hiểu nhé :

Code command button :
Private Sub Command1_Click()
On Error GoTo Err_Command144_Click

DoCmd.OpenForm "Dan Ke Toan", acNormal, "", "", acAdd, acNormal
msgbox "Em là bé lên 3"
Exit_Command1_Click:
Exit Sub

Err_Command1_Click:
MsgBox Err.Description & " LÔI " & Err.Number

Resume Exit_Command1_Click
End Sub

Trong đoạn code trên mình muốn sau khi nó thực hiện mở Form "Dan Ke Toan", thì nó ngưng khoảng 1 giây mới mở tiếp msgbox thì có được không và dùng code nào.
Mình cho Sleep vào thì hình như nó ngưng cả phần mềm.
:chetroi:
 
Ðề: Cho mình hỏi về hàm Sleep với !

Mình có tạo 1 nút lệnh để thực hiện backup dữ liệu ,trong phần đầu code của nút này mình mở 1 cái Form (Form này sau khi mở sẽ đóng sau 1/10 của giây và có thực hiện 1 số lệnh sau khi đóng)

Và mình muốn hỏi đoạn code của nút đó sau khi thực hiện mở Form ,mình muốn các đoạn code tiếp sau sẽ dừng lại khoảng 1/2 giây có được không .
Mình có dùng hàm Sleep nhưng có vẻ nó ngưng hoạt động của toàn bộ phần mềm thì phải, mà mình chỉ muốn ngưng thực hiện đoạn code trong cái nút kia thôi .
Code hàm sleep như sau :

Mã:
 Public Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)

Sau đó mình gọi hàm Sleep(500)

Ví dụ thế này cho dễ hiểu nhé :

Code command button :


Trong đoạn code trên mình muốn sau khi nó thực hiện mở Form "Dan Ke Toan", thì nó ngưng khoảng 1 giây mới mở tiếp msgbox thì có được không và dùng code nào.
Mình cho Sleep vào thì hình như nó ngưng cả phần mềm.
:chetroi:

Bắt thủ tục Timer của form đi bạn. Cho Timer Interval của nó là 1000 nếu hoãn 1s.

Private Sub Form_Load()
TimerInterval = 1000
End Sub

Private Sub Form_Timer()
MsgBox "Be len 3"
TimerInterval = 0
End Sub
 
Ðề: Cho mình hỏi về hàm Sleep với !

Thanks bác nhưng cái này hình như không được. Em nói cũng chưa rõ lắm.
Form Dan Ke Toan có source đến Back End
. Cái command button này dùng để backup dữ liệu,code rất dài nên em chỉ ví dụ nhỏ như trên. Mà khi backup dùng lệnh FileCopy thì phải đảm bảo Back End không còn ai sử dụng. Thế nên mục đích em mở cái Form trên sẽ đóng sau 1/10 s là để refesh lại Back End (Vì khi Back End có người truy cập thì nó sẽ tạo ra 1 file .laccdb,trong trường hợp tắt máy đột ngột file này vẫn tồn tại) vì thế trước khi backup chạy cái Form trên nếu không còn ai truy cập Back End thì file .laccdb sẽ mất.
Vậy là đảm bảo nếu không còn ai truy cập Back End thì file .laccdb sẽ mất.
VÀ như thế quá trình thực hiện backup sẽ diễn ra.

Và em muốn trong đoạn code của command button nó sẽ trì hoãn một tẹo sau khi mở Form Dan Ke Toan để đảm bảo rằng Form Dan Ke Toan đã đóng trước khi các lệnh thực hiện backup diễn ra. Nếu không thì mặc dù đang không có ai truy cập BackEnd nó vẫn sẽ báo có người đang truy cập Back End vì Form Dan Ke Toan chưa kịp đóng.
Mà trong trường hợp sử dụng qua mạng Lan không khéo code lại xử lý nhanh hơn cả việc refesh lại cái file .laccdb thì chết.
 
Ðề: Cho mình hỏi về hàm Sleep với !

Thanks bác nhưng cái này hình như không được. Em nói cũng chưa rõ lắm.
Form Dan Ke Toan có source đến Back End
. Cái command button này dùng để backup dữ liệu,code rất dài nên em chỉ ví dụ nhỏ như trên. Mà khi backup dùng lệnh FileCopy thì phải đảm bảo Back End không còn ai sử dụng. Thế nên mục đích em mở cái Form trên sẽ đóng sau 1/10 s là để refesh lại Back End (Vì khi Back End có người truy cập thì nó sẽ tạo ra 1 file .laccdb,trong trường hợp tắt máy đột ngột file này vẫn tồn tại) vì thế trước khi backup chạy cái Form trên nếu không còn ai truy cập Back End thì file .laccdb sẽ mất.
Vậy là đảm bảo nếu không còn ai truy cập Back End thì file .laccdb sẽ mất.
VÀ như thế quá trình thực hiện backup sẽ diễn ra.

Và em muốn trong đoạn code của command button nó sẽ trì hoãn một tẹo sau khi mở Form Dan Ke Toan để đảm bảo rằng Form Dan Ke Toan đã đóng trước khi các lệnh thực hiện backup diễn ra. Nếu không thì mặc dù đang không có ai truy cập BackEnd nó vẫn sẽ báo có người đang truy cập Back End vì Form Dan Ke Toan chưa kịp đóng.
Mà trong trường hợp sử dụng qua mạng Lan không khéo code lại xử lý nhanh hơn cả việc refesh lại cái file .laccdb thì chết.

Quan điểm này của bạn, tôi thấy không ổn lắm, xin lỗi chỉ theo cá nhân tôi.

Vì theo thông thường, việc backup dữ liệu cần phải được an toàn và phải được backup vào thời gian không ai đăng nhập để làm việc.

Do vậy, trong các module Front End của bạn , bạn nên kiểm soát thời gian mà người sử dụng đăng nhập. Nếu thời gian đăng nhập thuộc khoảng thời gian sẽ thực hiện backup, bạn sẽ thông báo khuyến cáo cho người sử dụng biết. Có thể dùng Timer để định kỳ thông báo cho người dùng biết.

Ngoài ra, bạn nên có một thủ tục riêng để thực hiện việc kiểm tra các kết nối. Nếu tồn tại kết nối nào đó vào lúc backup, việc đầu tiên là "đá" hết tất cả các kết nối. Sau đó sẽ tiến hành backup.

Các hệ quản trị CSDL khác cũng làm thế hoặc tương tự thế.

----------------------

Một ý kiến thêm vớibạn và các bạn khác:

  • Đừng tự làm khó mình, hãy suy nghĩ đơn giản. Khi viết "khó quá, hay quá" thì sau này lại khó maintain.
  • Chỉ nên dùng các hàm Windows API khi thực sự trong Access nói riêng và trong các IDE nói chung không có các hàm, thủ tục built-in hỗ trợ. Mà hiện nay, hầu hết đã hỗ trợ rất nhiều rồi.
 
Sửa lần cuối:
Ðề: Cho mình hỏi về hàm Sleep với !

Quan điểm này của bạn, tôi thấy không ổn lắm, xin lỗi chỉ theo cá nhân tôi.

Vì theo thông thường, việc backup dữ liệu cần phải được an toàn và phải được backup vào thời gian không ai đăng nhập để làm việc.

Do vậy, trong các module Front End của bạn , bạn nên kiểm soát thời gian mà người sử dụng đăng nhập. Nếu thời gian đăng nhập thuộc khoảng thời gian sẽ thực hiện backup, bạn sẽ thông báo khuyến cáo cho người sử dụng biết. Có thể dùng Timer để định kỳ thông báo cho người dùng biết.

Ngoài ra, bạn nên có một thủ tục riêng để thực hiện việc kiểm tra các kết nối. Nếu tồn tại kết nối nào đó vào lúc backup, việc đầu tiên là "đá" hết tất cả các kết nối. Sau đó sẽ tiến hành backup.

Các hệ quản trị CSDL khác cũng làm thế hoặc tương tự thế.

----------------------

Một ý kiến thêm vớibạn và các bạn khác:

  • Đừng tự làm khó mình, hãy suy nghĩ đơn giản. Khi viết "khó quá, hay quá" thì sau này lại khó maintain.
  • Chỉ nên dùng các hàm Windows API khi thực sự trong Access nói riêng và trong các IDE nói chung không có các hàm, thủ tục built-in hỗ trợ. Mà hiện nay, hầu hết đã hỗ trợ rất nhiều rồi.

Đồng ý với quan điểm này của phatnq2002. Nhiều bạn cứ tự làm khó mình khi tháy cái gì hay là đem áp dung nhưng chưa thật sự hiểu sâu về nó. Cái này ngày xưa tôi cũng dã từng mắc phải và chỉ đến khi gặp qúa nhiều lỗi tôi mới phát hiện ra cái "ngu dốt" của mình. Mong rằng các bạn đừng tự quá làm khó mình
Thân
 
Ðề: Cho mình hỏi về hàm Sleep với !

Quan điểm này của bạn, tôi thấy không ổn lắm, xin lỗi chỉ theo cá nhân tôi.

Vì theo thông thường, việc backup dữ liệu cần phải được an toàn và phải được backup vào thời gian không ai đăng nhập để làm việc.

Do vậy, trong các module Front End của bạn , bạn nên kiểm soát thời gian mà người sử dụng đăng nhập. Nếu thời gian đăng nhập thuộc khoảng thời gian sẽ thực hiện backup, bạn sẽ thông báo khuyến cáo cho người sử dụng biết. Có thể dùng Timer để định kỳ thông báo cho người dùng biết.

Ngoài ra, bạn nên có một thủ tục riêng để thực hiện việc kiểm tra các kết nối. Nếu tồn tại kết nối nào đó vào lúc backup, việc đầu tiên là "đá" hết tất cả các kết nối. Sau đó sẽ tiến hành backup.

Các hệ quản trị CSDL khác cũng làm thế hoặc tương tự thế.

----------------------

Một ý kiến thêm vớibạn và các bạn khác:

  • Đừng tự làm khó mình, hãy suy nghĩ đơn giản. Khi viết "khó quá, hay quá" thì sau này lại khó maintain.
  • Chỉ nên dùng các hàm Windows API khi thực sự trong Access nói riêng và trong các IDE nói chung không có các hàm, thủ tục built-in hỗ trợ. Mà hiện nay, hầu hết đã hỗ trợ rất nhiều rồi.

:xinloinhe:
Không phải là em tự làm khó em đâu, mà chẳng qua em chả học tí gì về lập trình, cho nên biết đến đâu em làm đến đó. Nên đôi khi code có thể rườm rà, thừa thãi.

Việc backup thực hiện tự động theo số ngày đã định sẵn.
Chỉ cho backup tối đa 3 file.
Việc backup này thực hiện trong sự kiện đóng Form chính,Form này chỉ đóng khi tắt phần mềm.

Quy trình backup của em như sau :

1. Kiểm tra đã đến ngày backup chưa.
2. Như bác nói việc backup vào thời gian không ai đăng nhập để làm việc, nên em mới cần mở cái Form Dan Ke Toan rồi đóng nó để refesh lại cái file .laccdb (vì file này sẽ không mất trong trường hợp cúp điện ).
- Trong trường hợp vẫn có người truy cập(tức là file .laccdb sẽ không mất) thì việc backup sẽ không xảy ra.
- Nếu không còn ai truy cập Back End thì đương nhiên file .laccdb sẽ mất đi và
thực hiện backup.
Nếu backup diễn ra thì
3. Kiểm tra trong thư mục BACKUP có tồn tại file backup không, và có mấy file dựa vào câu lệnh :
Mã:
     file1 = Dir(Link & "Backup\" & Fname & "*.accdb")
                 file2 = Dir
                 file3 = Dir
4. Nếu đã tồn tại đủ 3 file, tức là câu lệnh trên không phát sinh lỗi và file3 <>""
Thì em thực hiện so sánh 3 file đó có ngày nào nhỏ nhất sẽ xóa file đó và copy bản mới vào.
5.
- Nếu file 3 = "" tức là chỉ có 2 file thì sẽ copy thôi.
- Nếu phát sinh lỗi số 5 tức là chỉ có 1 file hoặc không có file nào thì cũng chỉ copy bằng lệnh FileCopy.

Bác thấy nó không ổn ở chỗ nào không, mà theo ý bác trong lúc đang backup mà có người truy cập thì mình dựa vào cái gì để chặn đây. Bác nói em mới nghĩ đến.
Nếu khi bắt đầu backup chạy cái Query update vào table "Dang backup" ,các Client khác đăng nhập phải kiểm tra nếu là "Đang backup" thì chặn không cho họ truy cập coi bộ cũng không ổn. Vì lỡ nếu đang backup mà mất điện thì sao,thì cái dòng "Đang backup " cứ tồn tại mãi, và rốt cuộc không còn ai có thể vào phần mềm được nữa.
:chetroi:
 
Ðề: Cho mình hỏi về hàm Sleep với !

:xinloinhe:
Không phải là em tự làm khó em đâu, mà chẳng qua em chả học tí gì về lập trình, cho nên biết đến đâu em làm đến đó. Nên đôi khi code có thể rườm rà, thừa thãi.

Việc backup thực hiện tự động theo số ngày đã định sẵn.
Chỉ cho backup tối đa 3 file.
Việc backup này thực hiện trong sự kiện đóng Form chính,Form này chỉ đóng khi tắt phần mềm.

Quy trình backup của em như sau :

1. Kiểm tra đã đến ngày backup chưa.
2. Như bác nói việc backup vào thời gian không ai đăng nhập để làm việc, nên em mới cần mở cái Form Dan Ke Toan rồi đóng nó để refesh lại cái file .laccdb (vì file này sẽ không mất trong trường hợp cúp điện ).
- Trong trường hợp vẫn có người truy cập(tức là file .laccdb sẽ không mất) thì việc backup sẽ không xảy ra.
- Nếu không còn ai truy cập Back End thì đương nhiên file .laccdb sẽ mất đi và
thực hiện backup.
Nếu backup diễn ra thì
3. Kiểm tra trong thư mục BACKUP có tồn tại file backup không, và có mấy file dựa vào câu lệnh :
Mã:
     file1 = Dir(Link & "Backup\" & Fname & "*.accdb")
                 file2 = Dir
                 file3 = Dir
4. Nếu đã tồn tại đủ 3 file, tức là câu lệnh trên không phát sinh lỗi và file3 <>""
Thì em thực hiện so sánh 3 file đó có ngày nào nhỏ nhất sẽ xóa file đó và copy bản mới vào.
5.
- Nếu file 3 = "" tức là chỉ có 2 file thì sẽ copy thôi.
- Nếu phát sinh lỗi số 5 tức là chỉ có 1 file hoặc không có file nào thì cũng chỉ copy bằng lệnh FileCopy.

Bác thấy nó không ổn ở chỗ nào không, mà theo ý bác trong lúc đang backup mà có người truy cập thì mình dựa vào cái gì để chặn đây. Bác nói em mới nghĩ đến.
Nếu khi bắt đầu backup chạy cái Query update vào table "Dang backup" ,các Client khác đăng nhập phải kiểm tra nếu là "Đang backup" thì chặn không cho họ truy cập coi bộ cũng không ổn. Vì lỡ nếu đang backup mà mất điện thì sao,thì cái dòng "Đang backup " cứ tồn tại mãi, và rốt cuộc không còn ai có thể vào phần mềm được nữa.
:chetroi:

Trước tiên cần hiểu cái file .laccdb nó làm gì, nhiệm vụ của nó là gì:

.laccdb là một file để kiểm soát việc khóa file (file locking) của Access 2007 trở lên. Với Access 2003 trở xuống thì nó là file .ldb. Các file này tự động xóa khi file database của Access được đóng.

File này được dùng để lưu giữ các thông tin về việc thay đổi giá trị của cùng một nơi (record, table) trong một database dùng chung.

Do vậy, với cách thiết kế của bạn, thì ở Front End và Back End đều tạo ra các lock file khác nhau.

Cái lock file ở đây là cái lock file của cái Back End.

Điều mà bạn đang "lo lắng" là cái lock file này có đang tồn tại hay không. Nếu tồn tại thì sẽ có 2 nguyên nhân:

  • Có ai đó vẫn đang truy cập file Back End.
  • Các kết nối bị ngắt giữa chừng khiến cho lock file không tự động xóa.
Nếu bạn cho xóa mà báo lỗi thì chắc chắn đang có ai đó kết nối đến Back End.

Do vậy, bạn chỉ cần quan tâm đến nếu không xóa được lock file thì có nghĩa là còn người kết nối.

Việc lúc này là làm sao để có thể khuyến cáo và/hoặc cho ngưng kết nối là được.

Tôi chỉ có thể nói lý thuyết là thế, còn việc thực hiện thì mỗi người mỗi ý. Nếu bạn thấy kiểu này thích hợp thì bạn design theo hướng này, sau đó post lại, chúng ta thảo luận tiếp.
 
Ðề: Cho mình hỏi về hàm Sleep với !

Bác nói đúng ý em rùi. Khi kill sẽ xuất hiện lỗi 70.
Mà em còn băn khoăn 2 điều :
1. "Việc lúc này là làm sao để có thể khuyến cáo và/hoặc cho ngưng kết nối là được."
Có thể cho khuyến cáo đề nghị tắt phần mềm đến các máy Client hoặc bắt buộc tắt phần mềm.
Để làm được vấn đề này theo ý em thì cái Form chính phải luôn trong trạng thái kiểm tra ( tức là cứ 1s nó phải Dlookup trong table nếu nhận được giá trị "Quit" thì tắt phần mềm )
Vậy nếu có 10 máy truy cập dữ liệu qua mạng LAN cứ 1s nó kiểm tra thì có làm cho hệ thống bị chậm không ?
2. Như em đã nói, khi đang backup mà có người vô truy cập dữ liệu thì làm sao để chặn hộ đây.
 
Ðề: Cho mình hỏi về hàm Sleep với !

Bác nói đúng ý em rùi. Khi kill sẽ xuất hiện lỗi 70.
Mà em còn băn khoăn 2 điều :
1. "Việc lúc này là làm sao để có thể khuyến cáo và/hoặc cho ngưng kết nối là được."
Có thể cho khuyến cáo đề nghị tắt phần mềm đến các máy Client hoặc bắt buộc tắt phần mềm.
Để làm được vấn đề này theo ý em thì cái Form chính phải luôn trong trạng thái kiểm tra ( tức là cứ 1s nó phải Dlookup trong table nếu nhận được giá trị "Quit" thì tắt phần mềm )
Vậy nếu có 10 máy truy cập dữ liệu qua mạng LAN cứ 1s nó kiểm tra thì có làm cho hệ thống bị chậm không ?
2. Như em đã nói, khi đang backup mà có người vô truy cập dữ liệu thì làm sao để chặn hộ đây.

Trước tiên, cần lưu ý là bạn phải có một cái "Front End" để chỉ chuyên trị các thủ tục hệ thống, bao gồm cả thủ tục back up của bạn.

1. Nếu sử dụng mạng LAN, và trong hệ thống không sử dụng firewall, bạn có thể tạo một file batch trong đó dùng các lệnh NET SEND để gửi thông điệp đến các user. Làm theo cách này, bạn phải bật dịch vụ Messenger của các máy trạm.
Trước khi đến giờ backup, bạn sẽ cho chạy file batch này (nó chạy trên command window - do vậy nếu bạn muốn cho nó chạy trong thủ tục của Access, bạn phải gọi lệnh Shell). Các user có trong danh sách sẽ nhận message này. Bạn có thể cho chạy vài lần trong một thời gian nhất định. Bạn có thể tham khảo thêm từ Google để biết sử dụng NET SEND, file Batch (.BAT), và lệnh Shell.

2. Khi đã thỏa mãn điều kiện để backup, bạn phải có một thủ tục sao cho có thể mở database ở Back End ở chế độ Exclusive. Như vậy chỉ có bạn mới là người được thao tác trên dữ liệu của Back End. Những người khác nếu muốn kết nối đến trong khi bạn backup thì sẽ bị cảnh báo, như thế họ sẽ không thể vào được.

Tạm thời tôi đề nghị một giải là như thế. Có ai có giải pháp tốt hơn thì cung cấp cho anh em tham khảo thêm.
 
Ðề: Cho mình hỏi về hàm Sleep với !

Mình có một giải pháp, mọi người tham khảo xem sao nhé.

Yêu cầu:
Dùng chức năng mạng Winsock (MSWINSCK.OCX) để gởi thông điệp trạng thái của máy chủ (máy chứa data).

Cách xử lý như sau:

Tại máy chủ mở một cổng để các client lắng nghe hiện trạng, giả sử có 2 hiện trạng 1 (cho phép kết nối data) và 0 (cấm kết nối). Khi cần thao tác các xử lý hệ thống như (backup,...), ứng dụng sẽ gởi trạng thái 0.

Ứng dụng client sẽ có các trạng thái sau:

Log in: Xin phép cho đăng nhập bằng cách kiểm tra hiện trạng, nếu nhận trạng thái trả về là 0 thì ko cho phép mở kết nối đến data.

Đang sử dụng: Dùng timer để luôn luôn lắng nghe trạng thái tại máy chứa data trả về, nếu máy chủ trả về là 0 thì hiển thị 1 cảnh báo ứng dụng sẽ tự động quit trong 1 khoản thời gian hợp lý nào đó, yêu cầu người sử dụng phải save các thay đổi.
 
Ðề: Cho mình hỏi về hàm Sleep với !

Cái 1 nó chuyên sâu về lập trình quá nên từ từ em ngâm cứu.
Còn cái 2 em hỏi chút , bản thân câu lệnh FileCopy hoặc CompactDatabase nó chỉ có thể thực hiện trên Back End đã đóng, tức là lúc chạy câu lệnh này liệu nó đã gán chế độ Exclusive cho Back End chưa và liệu nó có thể chặn các truy cập khác chưa.
Chứ nếu mình gán Exclusive cho Back End thì vẫn có 1 người được mở Back End, mà nếu mở rồi thì FileCopy hoặc CompactDatabase làm sao chạy được nữa.
 
Ðề: Cho mình hỏi về hàm Sleep với !

CompactDatabase thì ok, chứ FileCopy thì không được roài.
 

CẨM NANG KẾ TOÁN TRƯỞNG


Liên hệ: 090.6969.247

KÊNH YOUTUBE DKT

Cách làm file Excel quản lý lãi vay

Đăng ký kênh nhé cả nhà

SÁCH QUYẾT TOÁN THUẾ


Liên hệ: 090.6969.247

Top