1. Trang chủ
  2. » Công Nghệ Thông Tin

Bài giảng Bài 9: Tiếp tục cải tiến chương trình đồ họa liệt kê các số nguyên tố

20 8 0

Đang tải... (xem toàn văn)

Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống

THÔNG TIN TÀI LIỆU

Bài giảng Bài 9: Tiếp tục cải tiến chương trình đồ họa liệt kê các số nguyên tố sau đây được biên soạn nhằm trang bị cho các bạn những kiến thức về lập trình đa luồng trong ứng dụng đồ họa, sử dụng ProgressMonitor, sử dụng SwingWorker, sử dụng PropertyChangeListener.

Bài 9: Tiếp tục cải tiến chương trình đồ họa liệt kê số nguyên tố Lê Hồng Phương, Nguyễn Việt Hùng, Hà Mỹ Linh phuonglh@gmail.com Khoa Toán-Cơ-Tin học Trường Đại học Khoa học Tự nhiên Hà Nội Nội dung ● Tiếp tục cải tiến chương trình liệt kê số nguyên tố giảng trước: – Lập trình đa luồng ứng dụng đồ họa: ● ● Luồng đồ họa Luồng công việc – Sử dụng ProgressMonitor – Sử dụng SwingWorker – Sử dụng PropertyChangeListener 2012-2013 Object-Oriented Programming: Collections Nguyên tắc tách luồng ● ● Khi lập trình ứng dụng có giao diện đồ họa, ta cần ý nguyên tắc tách luồng: – Luồng đồ họa: vẽ, cập nhật thành phần đồ họa, nhận kiện bấm phím, kích chuột – Luồng công việc: sử dụng để chạy tác vụ cần nhiều thời gian để thực Chú ý: luồng đồ họa gọi luồng phân phối kiện: Event Dispatch Thread – EDT Mọi ứng dụng đồ họa chạy luồng đồ họa 2012-2013 Object-Oriented Programming: Collections Nguyên tắc tách luồng ● ● ● Trong chương trình liệt kê số nguyên tố giảng trước, ta không tách luồng Nếu người dùng nhập vào số n lớn cỡ hàng trăm triệu tác vụ liệt kê số nguyên tố nhiều thời gian Trong thời gian chờ tính tốn, giao diện đồ họa chương trình khơng hoạt động: – Người dùng khơng thể chọn thực đơn hay thực cơng việc khác giao diện – Lí do: luồng đồ họa bận tính tốn! 2012-2013 Object-Oriented Programming: Collections Nguyên tắc tách luồng ● ● Ta cần cải tiến chương trình với cách giải bản: – Viết luồng cơng việc có nhiệm vụ liệt kê số nguyên tố, chạy tách riêng khỏi luồng đồ họa – Khi luồng công việc thực xong nhiệm vụ, trả kết thực cập nhật kết giao diện luồng đồ họa Trong thực tế, không thiết phải chờ luồng cơng việc chạy xong, có kết tồn thực cập nhật đồ họa – 2012-2013 Cập nhật giao diện, sử dụng kết trung gian → Tăng tính tương tác chương trình Object-Oriented Programming: Collections Cách giải ● Với cách giải bản, ta cập nhật giao diện luồng cơng việc kết thúc – Tăng cường tính tương tác cách sử dụng tiến trình (JProgressBar) hộp thoại tiến trình (ProgressMonitor) định mức độ hồn thành tác vụ luồng cơng việc – Nếu dùng ProgressMonitor, người dùng ngắt luồng công việc chừng cách nhấn nút Cancer 2012-2013 Object-Oriented Programming: Collections ProgressMonitor ● ● Với số n nhỏ chương trình chạy nhanh, hộp thoại tiến trình khơng xuất Nhập số n lớn, hộp thoại tiến trình xuất private ProgressMonitor progressMonitor; progressMonitor = new ProgressMonitor( PrimeNumberFrame.this, "Computing prime numbers ", "", 0, 100); 2012-2013 Object-Oriented Programming: Collections Một trường lớp PrimeNumberFrame Nguyên tắc cập nhật đồ họa ● ● ● Việc cập nhật trạng thái thành phần đồ họa cần phải thực luồng đồ họa Nếu luồng công việc thực chức cập nhật thành phần đồ họa sinh ngoại lệ – chương trình bị lỗi Lớp SwingWorker giúp lập trình viên quản lí luồng cơng việc cập nhật đồ họa, tránh gây lỗi 2012-2013 Object-Oriented Programming: Collections ​Luồng khởi tạo ● ● Khi bắt đầu chương trình đồ họa, chương trình ln xuất phát từ luồng bắt đầu, hay luồng khởi tạo (initial thread) Nhiệm vụ luồng tạo đối tượng Runnable để sinh giao diện cho chương trình chuyển đối tượng vào chạy luồng đồ họa javax.swing.SwingUtilities.invokeLater(new Runnable() { public void run() { PrimeNumberFrame app = new PrimeNumberFrame(); app.pack(); app.setVisible(true); Ở đây, ta sử dụng lớp nội } không tên cài đặt giao diện }); Runnable (Chương trình gọn hơn) 2012-2013 Object-Oriented Programming: Collections Luồng đồ họa ● ● ● Sau luồng đồ họa khởi động chương trình điều khiển luồng Chương trình hoạt động theo nguyên tắc: nhận kiện → xử lí kiện Ví dụ: – Bấm phím Ok → liệt kê số nguyên tố – Chọn mục thực đơn Exit → chương trình – Chọn mục thực đơn About → mở hộp thoại About 2012-2013 Object-Oriented Programming: Collections 10 Luồng công việc ● ● Luồng công việc (worker thread hay background thread) sử dụng để thực tác vụ chậm Mỗi luồng công việc biểu diễn đối tượng thuộc lớp javax.swing.SwingWorker – ● Đây lớp trừu tượng, ta cần tạo lớp kế thừa lớp Lớp SwingWorker cung cấp phương thức hữu ích sau 2012-2013 Object-Oriented Programming: Collections 11 Luồng công việc ● ● Phương thức doInBackground thực tác vụ, trả kết để dùng luồng khác (thường dùng luồng đồ họa) Phương thức done chứa lệnh thực luồng đồ họa thực xong tác vụ 2012-2013 Object-Oriented Programming: Collections 12 Luồng công việc ● ● Chú ý: – Phương thức doInBackground trả kết trung gian cách gọi phương thức publish; – Phương thức process chứa lệnh thực luồng đồ họa để cập nhật dần giao diện Trong chương trình ví dụ, ta khơng sử dụng kết trung gian nên không dùng publish process 2012-2013 Object-Oriented Programming: Collections 13 Luồng công việc ● ● Luồng công việc cịn định nghĩa số thuộc tính, giá trị thuộc tính thay đổi làm phát siinh kiện thuộc kiểu PropertyChangeEvent – Ta quan tâm tới thuộc tính progress – Để thay đổi giá trị thuộc tính này, ta gọi phương thức setProgress Xử lí kiện PropertyChangeEvent cách – Viết lớp cài đặt giao diện PropertyChangeListener – Gọi phương thức addPropertyChangeListener 2012-2013 Object-Oriented Programming: Collections 14 class PrimeEnumerationTask extends SwingWorker { private int n; private DefaultListModel listModel; public PrimeEnumerationTask(int n) { super(); this.n = n; listModel = new DefaultListModel(); } } Kết trung gian (từng số nguyên tố) @Override protected DefaultListModel doInBackground() throws IOException { PrimeNumbers pn = new PrimeNumbers(); setProgress(0); int k = 2; while (k

Ngày đăng: 08/05/2021, 19:50

Xem thêm:

TÀI LIỆU CÙNG NGƯỜI DÙNG

TÀI LIỆU LIÊN QUAN

w