Chạy bất đồng bộ

Một phần của tài liệu XÂY DỰNG ỨNG DỤNG PHÁT HIỆN MẶT NGƯỜI DỰA TRÊN MÀU DA (Trang 76 - 78)

CHƯƠNG 4: XÂY DỰNG CHƯƠNG TRÌNH VÀ MỘT SỐ KẾT QUẢ MINH HỌA

4.4.3. Chạy bất đồng bộ

Ta cần thực hiện chạy công việc tìm các mặt người trong ảnh một cách bất đồng bộ khi đầu vào là file phim hoặc camera. Vì trong quá trình tìm mặt, ta phải cho phép người dùng dừng tìm mặt hay dừng phát phim hoặc camera bằng cách nhấn vào button tương ứng trên form. Nếu ta thực hiện đồng bộ thì khi form đang xử lý tìm mặt, mọi sự kiện nhấn nút đến nó đều sẽ không phản ứng, mà phim hay camera phát liên tục, tức là hết tìm mặt trên frame này sẽ tìm mặt trong frame khác, do đó không có kẽ hở nào để nhảy vào dừng tìm mặt hay dừng phim, camera. Vì vậy, ta phải chạy tìm mặt một cách bất đồng bộ.

Để chạy bất đồng bộ, tức là tạo ra 1 tiểu trình mới, ta có nhiều cách. Nhưng yêu cầu của tiểu trình này là nó phải có khả năng truy nhập lên các điều khiển trên form (button, text box,...) vì sau khi tìm mặt xong, ta phải vẽ lên ảnh trên form các khung hình chữ nhật màu xanh tại các vị trí khuôn mặt tìm được. Với yêu cầu này, ta sẽ sử dụng lớp BackgroundWorker cho chạy bất đồng bộ việc tìm mặt trong frame. Lớp này thuộc namespace: System.ComponentModel.

Đối tượng của lớp này có 3 biến sự kiện phục vụ cho chạy bất đồng bộ là:

• DoWork

• RunWorkerCompleted

• ProgressChanged

Sự kiện DoWork được dùng để bắt đầu tiểu trình ngầm. Nó được kích hoạt khi gọi phương thức RunWorkerAsync của đối tượng BackgroundWorker, và cho chạy hàm đăng kí sự kiện này. Hàm đăng kí sự kiện này phải có mẫu như sau:

bgwk_DoWork(object sender, DoWorkEventArgs e);

Trong hàm này không được truy nhập lên các điều khiển trên form. Mẫu hàm này kiểu như sau:

void bgwk_DoWork(object sender, DoWorkEventArgs e) {

//thuc hien tim mat tren anh dua vao

Bitmap anhvao;

anhvao = (Bitmap)e.Argument;

e.Result = fdr.TimMat_BDB(anhvao, bgwk, e); }

Sự kiện RunWorkerCompleted được kích hoạt khi hàm đăng kí trong sự kiện DoWork thực hiện xong. Hàm này chính là nơi để đưa các kết quả thu được từ hàm đăng kí trong sự kiện DoWork lên form, thực hiện truy nhập lên các điều khiển trên form. Các kết quả được lấy ra từ thuộc tính Result của tham số e. Mẫu hàm đăng kí sự kiện này như sau:

bgwk_RunWorkerCompleted(object sender,

RunWorkerCompletedEventArgs e); Nội dung trong hàm này kiểu như sau:

void bgwk_RunWorkerCompleted(object sender,

RunWorkerCompletedEventArgs e) {

if (e.Error != null)//có exeption được quăng ra //trong hàm chạy bất đồng bộ

{

MessageBox.Show(e.Error.Message, "Loi"); return; } if (e.Cancelled) { return; }

//lấy về kết quả từ thuộc tính e.Result //và hiển thị lên form

}

Sự kiện ProgressChanged được dùng để thông báo tiến độ công việc. Nó được kích hoạt khi gọi phương thức ReportProgress của đối tượng BackgroundWorker. Phương thức này sẽ được gọi trong hàm đăng kí sự kiện DoWork, sau khi mỗi công việc nhỏ hoàn thành. Hàm đăng kí sự kiện này sẽ nhận về giá trị tiến độ và trình diễn lên form. Mẫu hàm đăng kí sự kiện này như sau:

bgwk_ProgressChanged(object sender,

ProgressChangedEventArgs e); Trong chương trình không xử lý sự kiện này.

Để thực hiện cancel công việc bất đồng bộ này, ta gọi phương thức CancelAsync

của đối tượng BackGgroundWorker:

bgwk.CancelAsync();

Đồng thời trong mẫu hàm chạy bất đồng bộ phải có 2 tham số là: BackgroundWorker và DoWorkEventArgs. Như ở trong ví dụ trên, có dòng:

Tham số BackgroundWorker dùng để kiểm tra xem công việc này đã bị cancel chưa. Việc kiểm tra này được thực hiện qua thuộc tính CancellationPending. Nếu thuộc tính này trả về TRUE có nghĩa là công việc đã bị cancel. Lúc đó, ta cần dọn dẹp mọi thứ (giải phóng tài nguyên), rồi thoát khỏi hàm. Trước khi thoát khỏi hàm phải gán cho thuộc tính Cancel của tham số DoWorkEventArgs bằng TRUE để hàm xử lý kết thúc biết rằng công việc đã bị cancel, để bỏ qua không làm gì cả. Còn nếu giá trị của thuộc tính CancellationPending là FALSE có nghĩa là nó không bị cancel, và tiếp tục bình thường. Việc kiểm tra giá trị của thuộc tính này được thực hiện sau khi xong một bước công việc.

Một phần của tài liệu XÂY DỰNG ỨNG DỤNG PHÁT HIỆN MẶT NGƯỜI DỰA TRÊN MÀU DA (Trang 76 - 78)