email: lightnumberss@gmail.com

20/7/13

[Lazarus Pascal] Về Asynchronous Calls

Lược dịch lại từ Asynchronous_Calls

Phát biểu vấn đề 


Khi đang xử lí một Event, bạn cần phải làm một vài công việc khác, nhưng lại không thể làm ngay. Thí dụ: bạn cần free một object, nhưng nó lại tham chiếu tới một phần khác trong parent của mình, dẫn tới công việc "free một object" bị lỗi không thể thực hiện. 

Giải pháp 

Sử dụng Application.QueueAsyncCall: 

TDataEvent = procedure (Data: PtrInt) of object; 
procedure QueueAsyncCall(AMethod: TDataEvent; Data: PtrInt); 


Lệnh này sẽ đặt một method cho trước cùng với danh sách tham biến tương ứng cho trước vào một "hàng đợi" để thực thi trong main event loop, sau khi tất cả các sự kiện khác đã được xử lí. Trong vi dụ trên đây, tham chiếu của vật thể mà object chỉ tới đã tiêu mất, vì parent đã hoàn tất thực thi, vì thế bạn hoàn toàn thoải mái free object mà không đụng chạm ai cả. 
Lưu ý rằng đây là phiên bản tổng quát hơn ReleaseComponent, và ReleaseComponent gọi method này. 

Ví dụ 


Chương trình dưới đây sẽ giới thiệu về công dụng của QueueAsyncCall. Nếu bạn nhấn CallButton, 'Click 1', 'Click 2' và 'Async 1' sẽ được thêm vào LogListBox. Để ý rằng lời gọi Async chỉ được thực thi một khi sự kiện CallButtonClick kết thúc.