Danh mục

Bài giảng Lập trình Windows - Chương 8: Lập trình đa luồng (2016)

Số trang: 9      Loại file: pdf      Dung lượng: 697.63 KB      Lượt xem: 10      Lượt tải: 0    
Thư viện của tui

Xem trước 2 trang đầu tiên của tài liệu này:

Thông tin tài liệu:

Bài giảng "Lập trình Windows - Chương 8: Lập trình đa luồng" cung cấp cho người học các kiến thức: Giới thiệu lập trình đa luồng, lập trình luồng làm việc, lập trình luồng giao diện, một số lệnh liên quan, đồng bộ các luồng. Mời các bạn cùng tham khảo.
Nội dung trích xuất từ tài liệu:
Bài giảng Lập trình Windows - Chương 8: Lập trình đa luồng (2016)Chương 8Lập trìnhđa luồng18.1. Giới thiệu lập trình đa luồngKhai thác tính đa nhiệm, một chương trình có thể lập trình thực hiện nhiềuphần việc đồng thời. Gọi là lập trình đa luồng (thread), có thể gọi đa tuyến. Luồng là quá trình thực hiện một đơn vị chương trình, độc lập với thựchiện các đơn vị khác trong chương trình đó. Mỗi luồng thường gắn với thực hiện một hàm nào đó trong chương trình,ta gọi hàm này là hàm luồng. Mỗi chương trình khi chạy luôn có một luồng ứng với thực hiện hàm chínhcủa chương trình (WinMain), các luồng khác được tạo ra từ luồng này.luồng 3luồng 2luồng 1luồng 4luồng chính (main thread)thời gian28.1. Giới thiệu lập trình đa luồngMỗi luồng trong chương trình có mức độ ưu tiên thực hiện, là tài nguyênthời gian máy dành cho luồng. Ngoài ra mỗi luồng có các tài nguyên như stack, mức độ bảo mật,... Minh họa một chương trình đa luồng ứng với các hàm:Chương trìnhHàm 1Hàm 2Hàm 3Luồng 1Luồng 2Luồng chính (main thread)Luồng 3Luồng 4Có hai loại luồng: luồng làm việc (worker) và luồng giao diện (userinterface). Luồng làm việc chỉ chạy bên trong máy, còn luồng giao diệncung cấp những tương tác với người dùng.38.2. Lập trình luồng làm việcLuồng làm việc được lập trình bởi một hàm gọi là hàm luồng, sau đó tạoluồng từ hàm này, gồm hai bước sau:Bước 1: Lập hàm xử lý luồng (hàm luồng), mẫu hàm khai báo như sau:UINT tên_hàm ( LPVOID tham_số );Trong đó tham số sẽ nhận các dữ liệu cho việc thực hiện bên trong hàm luồng,nó được truyền từ câu lệnh tạo luồng ở bước 2.Bước 2: Tạo luồng tại thời điểm cần thiếtCWinThread* AfxBeginThread( tên_hàm_luồng , dữ_liệu_truyền );Có thể quy định các tham số như độ ưu tiên, độ lớn stack,... trong tham sốcủa lệnh tạo luồng. Mẫu đầy đủ như sau:CWinThread* AfxBeginThread( AFX_THREADPROC pfnThreadProc,LPVOID pParam, int nPriority = THREAD_PRIORITY_NORMAL, UINTnStackSize = 0, DWORD dwCreateFlags = 0, LPSECURITY_ATTRIBUTESlpSecurityAttrs = NULL );Lệnh tạo luồng trả về con trỏ đối tượng của luồng được tạo tương ứng,kiểu lớp CWinThread. Qua đối tượng này có thể tác động lên các luồng khichạy.48.3. Lập trình luồng giao diệnMFC cung cấp một lớp cho việc lập trình luồng kiểu giao diện, có tên CWinThread,lớp này có phương thức ảo Run() để chạy ứng với luồng.Chúng ta xây dựng một lớp kế thừa CWinThread, viết đè hàm Run() để thực hiệnluồng theo mẫu sau, lớp này phải có cơ chế tạo động – DYNCREATE.class tên_lớp_luồng : public CWinThread{ public: void Run(){..........lập trình hàm chạy luồng.............}DECLARE_DYNCREATE()};IMPLEMENT_DYNCREATE( tên_lớp_luồng , CWinThread )Viết lệnh tạo luồng sử dụng lớp trên tại thời điểm mong muốnCWinThreadAfxBeginThread( RUNTIME_CLASS( tên_lớp_luồng ) );Ngoài ra có thể viết đè các phương thức khác để thực hiện theo yêu cầu nhưInitInsance(), ExitInstance(), OnIdle(),... Luồng giao diện giống như luồng chínhcủa một ứng dụng.5

Tài liệu được xem nhiều: