Bài giảng Kỹ thuật lập trình hệ cơ điện tử: Chương 13 - C++ nâng cao được biên soạn bao gồm các nội dung chính sau: Xử lý ngoại lệ (Exception Handling; Bộ nhớ độn; Namespace; Template; Bộ tiền xử lý (Preprocessor); Xử lý tín hiệu (Signal Handling); Đa luồng (Multithread); Một số lớp quan trọng. Mời các bạn cùng tham khảo bài giảng!
TRƯỜNG ĐẠI HỌC BÁCH KHOA HÀ NỘI KỸ THUẬT LẬP TRÌNH HỆ CƠ ĐIỆN TỬ Programming Engineering in Mechatronics Giảng viên: TS. TS. Đặng Thái Việt Đơn vị: Bộ mơn Cơ điện tử, Viện Cơ khí Hà Nội, 09/2017 CHƯƠNG 13. C++ nâng cao 13.1 Xử lý ngoại lệ (Exception Handling) 13.2 Bộ nhớ động 13.3 Namespace 13.4 Template 13.5 Bộ tiền xử lý (Preprocessor) 13.6 Xử lý tín hiệu (Signal Handling) 13.7 Đa luồng (Multithread) 13.8 Một số lớp quan trọng Xử lý ngoại lệ (Exception Handling) Giới thiệu • • Một Exception (ngoại lệ) là một vấn đề xuất hiện trong khi thực thi một chương trình. Một Exception trong C++ là một phản hồi về một tình huống ngoại lệ mà xuất hiện trong khi một chương trình đang chạy, ví dụ như chia cho số 0 Exception cung cấp một cách để truyền điều khiển từ một phần của một chương trình tới phần khác. Exception Handling (Xử lý ngoại lệ) trong C++ được xây dựng dựa trên 3 từ khóa là: try, catch, và throw Xử lý ngoại lệ (Exception Handling) Giới thiệu § § § throw: Một chương trình ném một Exception khi một vấn đề xuất hiện. Việc này được thực hiện bởi sử dụng từ khóa throw trong C++ catch: Một chương trình bắt một Exception với một Exception Handler tại vị trí trong một chương trình nơi bạn muốn xử lý vấn đề đó. Từ khóa catch trong C++ chỉ dẫn việc bắt một exception try: Một khối try có thể được bắt bởi một số lượng cụ thể exception. Nó được theo sau bởi một hoặc nhiều khối catch Xử lý ngoại lệ (Exception Handling) Giới thiệu • Giả sử một khối sẽ tạo một Exeption, một phương thức bắt một exception bởi sử dụng kết hợp các từ khóa try và catch. Một khối try/catch được đặt xung quanh code mà có thể tạo một exception. Code bên trong một khối try/catch được xem như là code được bảo vệ, và cú pháp để sử dụng try/catch trong C++ như sau: Xử lý ngoại lệ (Exception Handling) Giới thiệu Xử lý ngoại lệ (Exception Handling) Ném Exception trong C++ • Exception có thể bị ném ở bất cứ đâu bên trong một khối code bởi sử dụng các lệnh throw trong C++. Tốn hạng của lệnh throw quyết định kiểu cho exception và có thể là bất kỳ biểu thức nào và kiểu kết quả của biểu thức quyết định kiểu của exception bị ném Xử lý ngoại lệ (Exception Handling) Bắt Exception trong C++ • Khối catch theo sau khối try trong C++ sẽ bắt bất kỳ exception nào. Bạn có thể xác định kiểu của exception bạn muốn bắt và điều này được xác định bởi khai báo exception mà xuất hiện trong các dấu ngoặc đơn theo sau từ khóa catch trong C++ Xử lý ngoại lệ (Exception Handling) Bắt Exception trong C++ • Code trên sẽ bắt một exception có kiểu là ten_Exception. Nếu bạn muốn xác định rằng một khối catch nến xử lý bất kỳ kiểu exception nào bị ném trong một khối try, bạn phải đặt một dấu ba chấm (…) trong các dấu ngoặc đơn theo sau từ khóa catch, như sau: Xử lý ngoại lệ (Exception Handling) Ví dụ 10 Đa luồng (Multithread) Joinable and not Joinable threads • • • • Sau khi hàm join return, thread trở lên khơng thể join lại. 1 joinable thread là 1 thread mà đại diện cho 1 execution mà chưa join 1 thread khơng là joinable khi nó được khởi tạo mặc định hoặc được moved/assigned tới 1 thread khác hoặc joind hoặc detach hàm đã được họi Not joinable thread có thể huỷ 1 cách an tồn Hàm joinable để checks thread có là joinable thread hay khơng 69 Đa luồng (Multithread) Joinable and not Joinable threads • • Nên sử dụng hàm này trước khi call hàm join(); This function returns true if the thread is joinable and false otherwise. It’s better to check if the thread is joinable before join() function is called: 70 Đa luồng (Multithread) Detaching thread • • Như đã nhắc ở trên, thread trở thành not joinable sau khi hàm detach được gọi Hàm này tách 1 thread từ 1 thread cha, nó cho phép thread cha và thread con được chạy ngay lập tức từ cái cịn lại. Sau khi call detach functon, các thread sẽ khơng đồng bộ trong bất kỳ cách nào 71 Đa luồng (Multithread) Detaching thread Bạn nhận thấy mainthread không đợi thread bị huỷ! 72 Đa luồng (Multithread) Initializing thread with an object • Bạn có thể khởi tạo thread khơng chỉ với 1 function mà có thể dùng với 1 object hoặc 1 function của class 73 Đa luồng (Multithread) Initializing thread with an object • Bây giờ bạn có thể khởi tạo thread bằng cách truyền object của class myFunctor vào hàm khởi tạo của thread: 74 Đa luồng (Multithread) Initializing thread with an object • • Nếu bạn muốn khởi tạo thread với 1 public function của class, bạn phải định nghĩa function và truyền object của class định nghĩa function đó: Bây giờ có thể khởi tạo thread với hàm publicFunction của myFunctor class: 75 Đa luồng (Multithread) Passing arguments to thread • • Trong ví dụ trên chúng ta chỉ sử dụng hàm và đối tượng mà khơng phải truyền thêm các argyments vào các hàm và object Chúng ta có thể sử dụng function vớ các paramaters cho khác hàm khởi tạo thread. Vd: 76 Đa luồng (Multithread) Passing arguments to thread • Có thruyền pointer tới function. Để truyền các arguments Để thấy function này có 3 arguments. Nếu bạn muốn khởi tạo với function này, trước hết bạn phải truyền con trỏ tới hàm 77 Đa luồng (Multithread) Passing arguments to thread • • Khi bạn khởi tạo 1 thread với 1 object có params, chúng ta phải add list các param tương ứng vào When you want to initialize a thread with an object with parameters, we have to add corresponding parameter list to the overloading version of operator (): 78 Đa luồng (Multithread) Passing arguments to thread • • Bạn có thể thấy, operator () có 2 paramaters: Khởi tạo thread với 1 object trong trường hợp này giống như sử dụng hàm với các paramater: 79 Đa luồng (Multithread) Passing arguments to thread • Có thể sử dụng 1 hàm của class như params của thread. Add 1 public function vào myFunctorParam class: 80 Đa luồng (Multithread) Passing arguments to thread • Truyền argument vào member function: 81 Đa luồng (Multithread) ThreadID • Mọi thread đều có 1 unique identifier. Và trong class thread có 1 public function cho phép get ra giá trị của thread Id giá trị trả về kiểu id được định nghĩa trong Thread class 82 Đa luồng (Multithread) ThreadID 83 ...CHƯƠNG? ?13. C++ nâng cao 13. 1 Xử lý ngoại lệ (Exception Handling) 13. 2 Bộ nhớ động 13. 3 Namespace 13. 4 Template 13. 5 Bộ tiền xử lý (Preprocessor) 13. 6 Xử lý tín hiệu (Signal Handling) 13. 7... mà xuất hiện trong khi một? ?chương? ?trình? ?đang chạy, ví dụ như chia cho số 0 Exception cung cấp một cách để truyền điều khiển từ một phần của một chương? ? trình? ? tới phần khác. Exception ... Giới thiệu § § § throw: Một? ?chương? ?trình? ?ném một Exception khi một vấn đề xuất hiện. Việc này được thực hiện bởi sử dụng từ khóa throw trong C++ catch: Một chương? ? trình? ? bắt một Exception