Thực hành Hệ điều hành - Bài thực hành số 3.2: Viết phần mềm demo sự tương tranh giữa các thread

Xây dựng chương trình cho phép người dùng thực hiện quản lý các thread có tên là AZ như kích hoạt chạy, tạm dừng, chạy lại, tăng/giảm quyền ưu tiền, dừng và xóa
thread... bằng các thao tác ấn phím. Mỗi thread khi chạy sẽ hiển thị icon miêu tả
mình lên form, icon sẽ chạy theo 1 phương xác ₫ịnh và khi ₫ụng thành form thì dội lại
theo nguyên lý vật lý.
ƒ Quan sát cảnh icon của thread này ₫è mất icon của thread khác, ₫ây là vấn ₫ề tương
tranh giữa các thread trong việc truy xuất các cell hiển thị trên form 
pdf 8 trang xuanthi 30/12/2022 800
Bạn đang xem tài liệu "Thực hành Hệ điều hành - Bài thực hành số 3.2: Viết phần mềm demo sự tương tranh giữa các thread", để tải tài liệu gốc về máy hãy click vào nút Download ở trên.

File đính kèm:

  • pdfthuc_hanh_he_dieu_hanh_bai_thuc_hanh_so_3_2_viet_phan_mem_de.pdf

Nội dung text: Thực hành Hệ điều hành - Bài thực hành số 3.2: Viết phần mềm demo sự tương tranh giữa các thread

  1. Trang 2 myStream = myAssembly.GetManifestResourceStream("ThreadDemo.Resources.Image" + c.ToString() + ".bmp"); threadLst[i].Pic = new Bitmap(myStream); threadLst[i].Xmax = 25; threadLst[i].Ymax = 20; } ClientSize = new Size(25 * 30, 20 * 30); this.Location = new Point(0, 0); this.BackColor = Color.Black; } 5. Tạo hàm xử lý sự kiện KeyDown cho Form. Cửa sổ mã nguồn sẽ hiển thị khung sườn của hàm vừa ₫ược tạo với thân rỗng, viết thân cho hàm này như sau : //hàm xử lý gỏ phím của user ₫ể quản lý thread private void Form1_KeyDown(object sender, KeyEventArgs e) { //xác ₫ịnh mã phím ấn, nếu không phải từ A-Z thì phớt lờ int newch = e.KeyValue; if (newch 0x5a) return; //xác ₫ịnh chức năng mà user muốn và thực hiện if (e.Control && e.Shift) { //kill thread // dừng Thread threadLst[newch - 65].start = false; } else if (e.Control) { //giảm ₫ộ ưu tiên tối thiểu threadLst[newch - 65].t.Priority = ThreadPriority.Lowest; MessageBox.Show(threadLst[newch - 65].t.Priority.ToString()); } else if (e.Control && e.Alt) { //tạm dừng thread if (threadLst[newch - 65].start && !threadLst[newch - 65].suspend) { threadLst[newch - 65].t.Suspend(); threadLst[newch - 65].suspend = true; } } else if (e.Alt) { //cho thread chạy lại if (threadLst[newch - 65].start && threadLst[newch - 65].suspend) { threadLst[newch - 65].t.Resume(); threadLst[newch - 65].suspend = false; } } else if (e.Shift) { //tăng ₫ộ ưu tiên tối ₫a threadLst[newch - 65].t.Priority = ThreadPriority.Highest; MessageBox.Show(threadLst[newch - 65].t.Priority.ToString()); }
  2. Trang 4 MyThread p = (MyThread)obj; //tạo ₫ối tượng vẽ Graphics g = this.CreateGraphics(); //tạo chổi màu ₫en ₫ể xóa cell cũ Brush brush = new SolidBrush(Color.FromArgb(0, 0, 0)); int x1, y1; int x2, y2; int x, y; bool kq=true; try { while (p.start) { //lặp trong khi chưa có yêu cầu kết thúc //xác ₫ịnh tọa ₫ộ hiện hành của thread x1 = p.Pos.X; y1 = p.Pos.Y; //hiển thị logo của thread ở (x1,y1) g.DrawImage(p.Pic, xCell * x1, yCell * y1); Color c = p.Pic.GetPixel(1,1); int yR, yG, yB; if (c.R > 128) yR = 0; else yR = 255; if (c.G > 128) yG = 0; else yG = 255; if (c.B > 128) yB = 0; else yB = 255; Pen pen = new Pen(Color.FromArgb(yR, yG, yB), 2); if (p.tx >= 0 && p.ty >= 0) { //hiện mũi tên góc dưới phải x = xCell * x1 + xCell - 2; y = yCell * y1 + yCell - 2; g.DrawLine(pen, x, y, x - 10, y); g.DrawLine(pen, x, y, x, y-10); } else if (p.tx >= 0 && p.ty = 0) { //hiện mũi tên góc dưới trái x = xCell * x1 + 2; y = yCell * y1 + yCell - 2; g.DrawLine(pen, x, y, x + 10, y); g.DrawLine(pen, x, y, x, y - 10); } else {//hiện mũi tên góc trên trái x = xCell * x1 + 2; y = yCell * y1 + 2; g.DrawLine(pen, x, y, x + 10, y); g.DrawLine(pen, x, y, x, y + 10); } //giả lập thực hiện công việc của thread tốn 500ms MySleep(500); //xác ₫ịnh vị trí mới của thread p.HieuchinhVitri(); x2 = p.Pos.X; y2 = p.Pos.Y; // Xóa vị trí cũ
  3. Trang 6 //₫ể tránh các trường hợp thread chạy thẳng ₫ứng hay ngang //=== double ChinhGocChay(double dblGocChay) { double goc = dblGocChay; if (0 0 && dblGocChay thay ₫ổi góc chạy if (x == 0 || x == Xmax - 1) { dblGocChay = DoiGocChayX(dblGocChay); } else if (y == 0 || y == Ymax - 1) dblGocChay = DoiGocChayY(dblGocChay); } //Hiệu chỉnh tọa ₫ộ x của thread tx = 2 * Math.Cos(dblGocChay * PI / 180); x = x + (int)tx; if (x < 0)
  4. Trang 8 ƒ Ấn phím Ctrl-X ₫ể giảm ₫ộ ưu tiên chạy cho thread X. ƒ Ấn phím Ctrl-Shift-X ₫ể dừng và thoát thread X. Khi số thread chạy tương ₫ối nhiều, hãy quan sát hiện tượng icon của thread này tiến ₫ến và ₫è icon của thread khác. Đây là vần ₫ề tương tranh giữa các thread khi chúng cùng truy xuất tài nguyên dùng chung (cell hiển thị).