Tôi đang làm việc trên một dự án plugin trong đó tôi đang sử dụng xử lý nền Eclipse.
Sự khác nhau giữa các phương pháp syncExec() và asyncExec() của lớp học Display là gì? Họ có thể áp dụng tình huống nào? Bất kỳ ví dụ nào cũng hữu ích.Sự khác biệt giữa syncExec() và asyncExec() của lớp Hiển thị
Trả lời
từ Q: Why do I get the error "org.eclipse.swt.SWTException: Invalid thread access"?
Để cho phép đề nền để thực hiện các hoạt động trên các đối tượng thuộc UI sợi, các phương pháp syncExec (Runnable Runnable) và asyncExec (Runnable Runnable) của hiển thị được sử dụng. Đây là những phương pháp duy nhất trong SWT có thể được gọi từ bất kỳ luồng nào. Chúng cho phép một runnable được thực thi bởi giao diện người dùng, hoặc đồng bộ, khiến cho chuỗi nền phải đợi cho runnable kết thúc, hoặc không đồng bộ cho phép luồng nền tiếp tục thực thi mà không cần chờ kết quả. Một runnable được thực hiện bằng cách sử dụng syncExec() gần giống nhất với cuộc gọi trực tiếp tương đương với hoạt động UI vì một cuộc gọi phương thức Java luôn chờ kết quả trước khi tiếp tục, giống như syncExec().
Thêm vào câu trả lời Tom Seidel của, đây là ví dụ về tình huống mà bạn có thể muốn sử dụng một hay khác:
Sử dụng
asyncExec
khi bạn muốn cập nhật cái gì đó trong giao diện người dùng mà không cần quan tâm đến các các kết quả. Ví dụ: cập nhật nhãn hoặc thanh tiến trình.Sử dụng
syncExec
nơi mã theo sau cuộc gọi phương thức đó cần phải chắc chắn rằng giao diện người dùng ở trạng thái nhất quán hoặc cần một số dữ liệu từ giao diện người dùng. Ví dụ: lấy một số dữ liệu từ hộp thoại người dùng. Hoặc bạn cập nhật tiện ích và trước khi thực hiện bất kỳ điều gì khác (ví dụ: cập nhật giao diện người dùng khác) bạn muốn biết rằng cập nhật tiện ích con đã hoàn tất.
SWT triển khai mô hình giao diện người dùng đơn luồng. Trong mô hình này, chỉ có UI-thread mới có thể gọi các hoạt động UI. Nếu bạn thử và truy cập một đối tượng SWT từ bên ngoài giao diện người dùng, bạn sẽ nhận được ngoại lệ "org.eclipse.swt.SWTException: Truy cập chuỗi không hợp lệ". Vì vậy, để cho phép các luồng khác thực hiện các hoạt động trên các đối tượng thuộc về UI-thread, SWT cung cấp các phương thức syncExec và asyncExec.
Điều này link có thể giúp bạn với ví dụ