02/10/2018, 00:46

Giới thiệu và hướng dẫn sử dụng Thread và Multi Thread, Process trong visual dot net

Hôm nay, mình xin hướng dẫn các bạn khái niệm về Thread và multi Thread, và Process được sử dụng như thế nào. Một số khái niệm: Process là gì? Process (hay còn gọi là tiến trình) : Khi chạy một ứng dụng, hệ điều hành sẽ cấp phát ...

Hôm nay, mình xin hướng dẫn các bạn khái niệm về Thread và multi Thread, và Process được sử dụng như thế nào.

Một số khái niệm:

Process là gì? 

Process (hay còn gọi là tiến trình) : Khi chạy một ứng dụng, hệ điều hành sẽ cấp phát riêng cho ứng dụng đó bộ nhớ và các tài nguyên khác. Bộ nhớ và tài nguyên vật lý riêng biệt này được gọi là một tiến trình. Các tài nguyên và bộ nhớ của một tiến trình thì chỉ tiến trình đó được phép truy cập.

Lưu ý Một ứng dụng thường có một tiến trình nhưng cũng có thể có nhiều tiến trình ! Tiến trình ≠ Ứng dụng

Tuyến (đoạn) – Thread :

Trong hệ thống, một tiến trình có thể có một hoặc nhiều chuỗi thực hiện tách biệt nhau và có thể chạy đồng thời. Mỗi chuỗi thực hiện này được gọi là một tuyến (Thread). Trong một ứng dụng, Thread khởi tạo đầu tiên gọi là Thread sơ cấp hay Thread chính. (Chính là phương thức Sub Main).

Đa nhiệm: 

– Mutitasking : Là khả năng của hệ điều hành làm nhiều công việc (ví dụ chạy nhiều ứng dụng) tại một thời điểm.

thead và process

Một số hình ảnh về mô hình đơn tuyến và đa tuyến

thead and multithead

Có 2 mô hình thread là Apartment Threading và Free Threading .

- Apartment-threading

- Free threading

appartmentTheading2

Trong mô hình thứ hai, do các thread có thể cùng chia sẻ và truy cập dữ liệu chung, do vậy có thể xảy ra xung đột (khiến kết quả không như mong muốn).

Ví dụ:

appartmentTheading3

Kết quả không thể xác định được (không nhất quán) khi nhiều thread cùng truy cập

Ưu điểm và hạn chế của cơ chế đa tuyến

Ưu điểm:

Trong một ứng dụng có thể cho nhiều "công việc" (tuyến-thread) được thực thi đồng thời. Các công việc này hoạt động độc lập với nhau và đóng vai trò như những chương trình riêng biệt. Một thread có thể treo (Hang) mà không ảnh hưởng đến các thread khác. Đa tuyến đặc biệt hữu ích trong việc xây dựng các ứng dụng Server – cái mà đáp ứng nhiều yêu cầu từ các Client.

Hạn chế:

Việc cài đặt chương trình theo kiểu đa tuyến phức tạp hơn. Đồng thời phải giải quyết vấn đề xung đột tài nguyên dùng chung. Việc cài đặt đa tuyến cũng sẽ tốn bộ nhớ hơn vì hệ thống phải lưu lại những thông tin về mỗi thread. Hơn nữa Processor phải mất nhiều thời gian hơn cho việc luân chuyển (switching) giữa các tuyến với nhau. Một vấn đề khác nữa là tình huống khóa chết – deadlock !

appartmentTheading4

Đa tuyến trong .NET

MS.NET Framework cung cấp cho nhà phát triển cơ chế đa tuyến theo mô hình Free Threading. Việc tạo và quản lý tuyến được thực hiện thông qua lớp Thread, thuộc namespace là System.Threading.

Mô tả về lớp Thread:

Một số phương thức thường dùng

theads_process2

Một số thuộc tính public thường dùng:

proccess and thead 3

Tạo một Thread trong VB.NET

Cú pháp tạo một tuyến trong VB.NET

code 1

ở trên là một ví dụ về : Một tiến trình có một Thread.

- Phân tích ví dụ trên:

- Một số câu hỏi:

Cho biết trình tự hiển thị các thông báo khi chạy chương trình sau đây:

code 2

Ví dụ 2: Tạo nhiều thread trong một tiến trình

Trong một chương trình (tiến trình) có thể tạo nhiều Thread, ví dụ:

vb3

Câu hỏi: Cho biết thứ tự thông báo sau đây ?

vb4

Một ví dụ khác:

vb5

Phương thức Join()

Theo mặc định, khi gọi phương thức Start của một thread thì câu lệnh ngay sau nó sẽ được thực thi mà không phụ thuộc vào việc thread đó đã kết thúc hay chưa. Như vậy, trong trường hợp nếu câu lệnh ngay sau lời gọi phương thức Start mà phụ thuộc vào kết quả thực thi của Thread (nói cách khác là ta muốn thread phải kết thúc trước khi làm câu lệnh sau Start) thì sẽ dẫn đến kết quả sai.

Ví dụ: Hiển thị các số từ 1 đến 10. Sau khi hiển thị xong thì thông báo "Đã xong !".

→ Rõ ràng là thông báo "Đã xong" chỉ được thực hiện sau khi Thread kết thúc.

vb6

vb7

Lưu ý: Phương thức Join chỉ được gọi nếu Thread đang ở trạng thái Running (Trước đó phải Start rồi). Có thể kiểm tra trạng thái của thread thông qua ThreadState.

Vấn đề xung đột trong cơ chế đa tuyến.

Trong ứng dụng windows Form, khi có nhiều Thread của ứng dụng truy cập ghi (write) đến điều khiển (Control) trên Form (tổng quát là truy cập đến Control toàn cục) thì .NET luôn cảnh báo với lỗi : "Cross-thread operation not valid…."

→ Giải quyết vấn đề này:

+ Nếu bạn thấy rằng việc truy cập đồng thời không gây ra những lỗi tiềm ẩn hay kết quả có thể xác định được thì bạn cứ dịch ra file Exe và chạy bình thường. Hoặc:

System.Windows.Forms.Control.CheckForIllegalCrossThreadCalls = False

+ Hoặc không Nhấn F5 (chế độ chạy có Debug) mà nhấn Ctrl-F5 (Không debug)

Ví dụ:

Tạo 2 thread, một thread TinhTong và một Thread TinhHieu của 2 số, kết quả hiển thị trên 2 Label tương ứng.

vb8

→ Rõ ràng hai thread này chỉ đọc giá trị trong textbox và ghi kết quả ra 2 label riêng biệt nên không có lỗi tiềm ẩn nào → ta không cần quan tâm đến cảnh báo của VS.NET.

vb9

Ý nghĩa : Tại một thời điểm chỉ cho phép một thread chạy đoạn lệnh (*) mà thôi. Điều này giúp ta tránh được các kết quả không theo ý muốn.

Ví dụ 2:

Viết 2 Thread, mỗi thread đều hiển thị kết quả trên cùng một textbox.

vb10

vb11

vb12

Kết quả khi có SyncLock

Một số ví dụ

Viết chương trình thể hiện 2 thanh tiến trình.

vb13

Viết chương trình mô phỏng đồng hồ điện tử

vb14

vb15

Chúc các bạn thành công. Mọi câu hỏi thắc mắc đến bài viết xin truy cập http://hoidap.laptrinhvb.net để được support.yes

ĐỪNG QUÊN LIKE AND SHARE NHA CÁC BẠN. 

CÁM ƠN CÁC BẠN ĐÃ THEO DÕI.

Tags: bất đồng bộthreadprocess
0