Chúng ta hãy cùng khám phá một kỹ thuật sử dụng vòng lặp tiếp theo là Event-Driven



- File : demo_event_driven.zip
- Type : zip
- Size : 485.1 KB
Trong
LabVIEW, thông thường khi kết thúc một vòng lặp, nó ngay lập tức bắt
đầu thực thi một vòng lặp tiếp theo. Không có một sự ngừng trệ hay trì
hoãn giữa các vòng lặp liên tục. Khi đó hệ thống luôn luôn phải dò xét
(polling) xem chương trình có thể thực thi được vòng lặp tiếp theo hay
chưa và khi nào kết thúc vòng lặp. Giải pháp tạm thời đưa ra là người
dùng chỉ cần thêm vào vòng lặp while một hàm Wait (ms) để cho
phép vòng lặp được nghỉ trong một khoảng thời gian xác định (Đơn vị ms).
Tuy nhiên khi sử dụng hàm Wait trong vòng lặp While lại phát sinh vấn
đề sau:
- Nếu người dùng đặt một khoảng thời gian
t(ms) rất nhỏ hoặc bằng 0 ms trong hàm Wait thì vòng lặp While cứ lặp đi
lặp lại liên tục, điều này dẫn tới việc toàn bộ CPU phải tập trung thực
thi ứng dụng của LabVIEW mà không có thời gian và tài nguyên để thực
thi các tác vụ khác, nhiều khi dẫn tới máy bị treo.
- Ngược lại nếu nếu thời gian t(ms) lớn hơn
tốc độ thực thi của vòng lặp trong chương trình thì sẽ gây ra sự chậm
trễ trong thời gian đáp ứng.
Giải pháp đưa ra trong trường hợp trên là đối
với những ứng dụng vẫn thường gặp thì người dùng cần phải xác định và
kiểm soát tốc độ thực thi vòng lặp của nó, mức độ tần suất thực thi của
vòng lặp để CPU có những khoảng thời gian dù nhỏ nhưng rất đáng kể nằm ở
trạng thái Idle, Sleep hoặc thực thi các tác vụ khác. Ngoài biện pháp
trên , Labview đã phát triển thêm cấu trúc event-driven với mục đích để tối ưu hóa vòng lặp
Sử dụng cấu trúc sự kiện trong LabVIEW (Event structure)
Vì sao phải sử dụng cấu trúc sự kiện?
Giả
sử ta có một ứng dụng mà người dùng sẽ tương tác với chương trình thông
qua một nút bấm trên Front Panel. Mỗi khi người dùng bấm vào nút đó thì
chương trình sẽ thực thi tác vụ đã được chỉ định trước. Chương trình đó
có thể được thực thi bởi code trong Block diagram sau đây.
Theo
đó, mỗi khi người dùng nhấn nút “Do some work?” thì nội dung code trong
cấu trúc Case (Trường hợp True) sẽ được thực thi. Ở đây, nội dung code
trong cấu trúc Case chỉ là tự
động cọng thêm một đơn vị để nhằm tính toán số lần người dùng nhấn nút
“Do Some Work?”. Mặc dù chúng ta cũng đã sử dụng kỹ thuật Timing cho
vòng lặp đã được trình bày ở các bài trước, song số lần thực thi vòng
lặp vẫn còn khá nhiều. Vòng lặp vẫn phải dò xét liệu rằng người dùng đã
nhấn nút hay chưa tuy rằng không còn liên tục nữa nhưng điều này cũng
chiếm khá nhiều tài nguyên của CPU trong các ứng dụng lớn và phức tạp.
Chúng ta thấy dù thực sự chúng ta chỉ cần 3 lần lặp cho 3 lần nhấn nút
“Do some work?” nhưng vòng lặp đã thực thi tới 339 lần tổng cộng. Có quá
nhiều lần thực thi một cách lãng phí (Đó là các trường hợp ứng “False”
trong cấu trúc Case). Vậy có cách nào để giải quyết sự lãng phí tài
nguyên CPU này hay không? Câu trả lời nằm ở cách lập trình dưới đây:
Trong
cách lập trình này, chúng ta đã sử dụng cấu trúc Event Driven để giải
quyết vấn đề chương trình, vòng lặp cứ phải liên tục polling (Dò xét)
liệu khi nào thì người dùng nhấn nút “Do some work?”. Ở đây, vòng lặp
chỉ thực thi khi người dùng nhấn nút mà thôi, trong thời gian người dùng
không tương tác, nhấn nút thì vòng lặp rơi vào trạng thái ngủ đông
(Idle), tài nguyên của máy được giải phóng hoàn toàn. Số lần lặp thực
thi tương ứng với số lần người dùng nhấn nút (5-5) như hình trên.
Định nghĩa sự kiện:
Giống như cấu trúc Case Structure, Event driven bao gồm nhiều sơ đồ con, trong số đó được cấu hình để xử lý một hoặc nhiều sự kiện. Sự kiện là những hành động người dùng trên front panel, chẳng hạn như nhấn vào một phím (Key Down) hoặc di chuyển chuột (Mouse Move) và có thể thêm một Event Structure để sơ đồ khối giống như bất cứ câu trúc nào khác của LabVIEW.
Như trường hợp trên, sự kiện ở đây là trường hợp nút nhấn “Do some
work?” thay đổi giá trị. Cứ mỗi lần nút nhấn có kiểu dữ liệu Boolean này
thay đổi trạng thái từ True sang False hoặc ngược lại thì tác vụ tương
ứng với sự kiện đó được thực thi.
Cách thức sử dụng và cấu hình sự kiện:
Người dùng có thể sử dụng cấu trúc event-driven để xử lý các sự kiện trong một ứng dụng giống như cấu trúc Case Structure, có thể thêm nhiều trường hợp sự kiện và có thể cấu hình những trường hợp để xử lý một hoặc nhiều sự kiện. Khi những sự kiện xảy ra, LabVIEW thực hiện các trường hợp tương ứng.
Khi các Event Structure đã xử lý một sự kiện, nó đã hoàn tất thực hiện. Event Structure không tự động lặp để xử lý nhiều sự kiện, điều này đòi hỏi bổ sung một vòng lặp while ngoài Event Structure.
Đó cũng chính là lí do chúng tôi coi việc sử dụng Event Structure là
một trong những kỹ thuật sử dụng vòng lặp và nội dung này được trình bày
trong serial bài viết cho chủ đề này.
Các hình ảnh dưới đây mô tả các thao tác
để đặt một cấu trúc sự kiện Event-driven trong Block diagram cũng như
cách cấu hình cho một sự kiện
Lựa chọn các sự kiện bằng click phải chuột lên biên cấu trúc sự kiện và chọn Edit Events Handled by This Case từ menu. Sử dụng hộp thoại Edit sự kiện xuất hiện để chỉnh sửa một hoặc nhiều trường hợp
Những lưu ý khi sử dụng cấu trúc Event-driven:
- 1. Ứng dụng đang chạy không phải dùng polling
- 2. Khi ứng dụng không hoạt động, hệ điều hành giải phóng tài nguyên, có thời gian xử lý các chương trình khác. Điều này làm cho VI và các ứng dụng khác hiệu quả hơn và nâng cao hiệu suất.
- 3. Mỗi lần một sự kiện xảy ra, nó được lưu trữ trong dữ liệu đang chờ xử lí của hệ điều hành. Khi các event-driven được tác động, sự kiện đầu tiên trong dữ liệu đang chờ xử lí được thực hiện, sau đó là sự kiện tiếp theo và cứ như vậy người dùng không phải lo lắng về việc thiếu một sự kiện thay đổi nhanh chóng trên Front Panel:
- 4. Không bao giờ đặt một cấu trúc event-driven bên trong một cấu trúc event-driven khác, khi đó Chương trình VI sẽ ngưng hoạt động.
- File : demo_event_driven.zip
- Type : zip
- Size : 485.1 KB
Người viết : Nguyễn Tiến & Dung nv
Đăng nhận xét