Bài giảng Lập trình Windows: Chương 8 - Lập trình đa luồng
Số trang: 9
Loại file: pdf
Dung lượng: 153.68 KB
Lượt xem: 8
Lượt tải: 0
Xem trước 2 trang đầu tiên của tài liệu này:
Thông tin tài liệu:
Chương 8 Lập trình đa luồng nhằm giới thiệu lập trình đa luồng, khai thác tính đa nhiệm, một chương trình có thể lập trình thực hiện nhiều phầ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ực hiệ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.
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ồngChương 8 Lập trình đa luồng 18.1. Giới thiệu lập trình đa luồng Khai thác tính đa nhiệm, một chương trình có thể lập trình thực hiện nhiều phầ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ực hiệ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ính của chương trình (WinMain), các luồng khác được tạo ra từ luồng này. luồng 3 luồng 2 luồng 1 luồng 4 luồng chính (main thread) thời gian 28.1. Giới thiệu lập trình đa luồng Mỗi luồng trong chương trình có mức độ ưu tiên thực hiện, là tài nguyên thờ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ình Luồng 1 Hàm 1 Luồng 2 Hàm 2 Luồng chính (main thread) Luồng 3 Hàm 3 Luồng 4 Có hai loại luồng: luồng làm việc (worker) và luồng giao diện (user interface). Luồng làm việc chỉ chạy bên trong máy, còn luồng giao diện cung 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ạo luồ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ết CWinThread* 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, UINT nStackSize = 0, DWORD dwCreateFlags = 0, LPSECURITY_ATTRIBUTES lpSecurityAttrs = 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 khi chạ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ện luồ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ốn CWinThread 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ính của một ứng dụng. 58.4. Một số lệnh liên quan Hàm kết thúc luồng void AfxEndThread( UINT nExitCode ); Một số thành viên lớp đối tượng CWinThread để quản lý luồng, CWinThread:: m_hThread : số hiệu định danh luồng, m_nThreadID : chỉ số của luồng, m_pMainWnd : con trỏ đối tượng cửa sổ chính của ứng dụng, int GetThreadPriority(); lấy độ ưu tiên của luồng, void SetThreadPriority( int k ); đặt độ ưu tiên luồng, DWORD SuspendThread(); tạm dừng thực hiện luồng, DWORD ResumeThread(); tiếp tục chạy luồng,... 68.5. Đồng bộ các luồng Khi các luồng thực hiện cùng xử lý một tài nguyên nào đó (ví dụ dữ liệu) có thể dẫn đến xung đột, không nhất quán gọi là không đồng bộ. Minh họa không đồng bộ giữa các luồng trên một dữ liệu data Thread1 Thread2 set A store data set B B store data A? use data use data inc by C inc by D change data change data B+C? A+D? use data use data thời gian 78.5. Đồng bộ các luồng... Cách 1: Sử dụng phương pháp dựng cờ, mỗi lần một luồng nào đó cần xử lý dữ liệu phải chờ trạng ...
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ồngChương 8 Lập trình đa luồng 18.1. Giới thiệu lập trình đa luồng Khai thác tính đa nhiệm, một chương trình có thể lập trình thực hiện nhiều phầ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ực hiệ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ính của chương trình (WinMain), các luồng khác được tạo ra từ luồng này. luồng 3 luồng 2 luồng 1 luồng 4 luồng chính (main thread) thời gian 28.1. Giới thiệu lập trình đa luồng Mỗi luồng trong chương trình có mức độ ưu tiên thực hiện, là tài nguyên thờ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ình Luồng 1 Hàm 1 Luồng 2 Hàm 2 Luồng chính (main thread) Luồng 3 Hàm 3 Luồng 4 Có hai loại luồng: luồng làm việc (worker) và luồng giao diện (user interface). Luồng làm việc chỉ chạy bên trong máy, còn luồng giao diện cung 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ạo luồ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ết CWinThread* 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, UINT nStackSize = 0, DWORD dwCreateFlags = 0, LPSECURITY_ATTRIBUTES lpSecurityAttrs = 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 khi chạ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ện luồ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ốn CWinThread 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ính của một ứng dụng. 58.4. Một số lệnh liên quan Hàm kết thúc luồng void AfxEndThread( UINT nExitCode ); Một số thành viên lớp đối tượng CWinThread để quản lý luồng, CWinThread:: m_hThread : số hiệu định danh luồng, m_nThreadID : chỉ số của luồng, m_pMainWnd : con trỏ đối tượng cửa sổ chính của ứng dụng, int GetThreadPriority(); lấy độ ưu tiên của luồng, void SetThreadPriority( int k ); đặt độ ưu tiên luồng, DWORD SuspendThread(); tạm dừng thực hiện luồng, DWORD ResumeThread(); tiếp tục chạy luồng,... 68.5. Đồng bộ các luồng Khi các luồng thực hiện cùng xử lý một tài nguyên nào đó (ví dụ dữ liệu) có thể dẫn đến xung đột, không nhất quán gọi là không đồng bộ. Minh họa không đồng bộ giữa các luồng trên một dữ liệu data Thread1 Thread2 set A store data set B B store data A? use data use data inc by C inc by D change data change data B+C? A+D? use data use data thời gian 78.5. Đồng bộ các luồng... Cách 1: Sử dụng phương pháp dựng cờ, mỗi lần một luồng nào đó cần xử lý dữ liệu phải chờ trạng ...
Tìm kiếm theo từ khóa liên quan:
Lập trình đa luồng làm việc Lập trình đa luồng Tổng quan lập trình đa luồng Lập trình Windows Kỹ thuật lập trình Windows Phương pháp lập trình Windows Ngôn ngữ lập trình WindowsTài liệu có liên quan:
-
Bài tập lập trình Windows dùng C# - Bài thực hành
13 trang 204 0 0 -
bảo mật mạng các phương thức giả mạo địa chỉ IP fake IP
13 trang 169 0 0 -
Excel add in development in c and c phần 9
0 trang 124 0 0 -
information technology outsourcing transactions process strategies and contracts 2nd ed phần 3
65 trang 116 0 0 -
Giáo trình Lập trình Windows 1 - Trường CĐN Đà Lạt
117 trang 104 0 0 -
Hướng dẫn lập trình OpenGL căn bản
33 trang 60 0 0 -
thủ thuật windows XP hay nhất phần 2
14 trang 47 0 0 -
The CISA Prep Guide Mastering the Certified Information Systems Auditor Exam phần 1
60 trang 46 0 0 -
Code Division Multiple Access (CDMA) phần 10
19 trang 42 0 0 -
Bài giảng Lập trình Windows: Bài 1 - Trần Ngọc Bảo
77 trang 39 0 0