Tôi đang viết một ứng dụng máy tính để bàn bằng SWT. Cách đơn giản nhất để cập nhật các điều khiển GUI từ một luồng khác là gì?Cách cập nhật GUI SWT từ một luồng khác trong Java
Trả lời
Sử dụng Display.asyncExec hoặc Display.syncExec, tùy theo nhu cầu của bạn.
Ví dụ, chủ đề khác có thể gọi phương thức này để cập nhật một cách an toàn một label:
private static void doUpdate(final Display display, final Label target,
final String value) {
display.asyncExec(new Runnable() {
@Override
public void run() {
if (!target.isDisposed()) {
target.setText(value);
target.getParent().layout();
}
}
});
}
Có hướng dẫn here.
"SWT thực hiện một điểm không thành công khi nói đến các vấn đề về luồng, vì vậy ít nhất các vấn đề điển hình không được chú ý cho đến khi sản xuất. Câu hỏi là, tuy nhiên, bạn sẽ làm gì nếu cần cập nhật một nhãn/nút/siêu Duper kiểm soát trong SWT từ một sợi nền Vâng, đó là đáng ngạc nhiên tương tự như Swing:"
// Code in background thread.
doSomeExpensiveProcessing();
Display.getDefault().asyncExec(new Runnable() {
public void run() {
someSwtLabel.setText("Complete!");
}
});
Bạn có thể thực sự vừa gửi một thông điệp tới các chủ đề GUI rằng một số sửa đổi có Đã được thay đổi. Điều này là sạch hơn nếu bạn nhìn thấy nó từ quan điểm MVC.
Khi tạo thread riêng biệt từ các chủ đề chính vượt qua các đối tượng Gui đến chủ đề mới và u có thể truy cập tất cả các thuộc tính của đối tượng GUI đó.
Chỉ vì luồng GUI có tham chiếu đến đối tượng GUI, không có nghĩa là nó có quyền truy cập vào nó. Bạn chỉ có thể cập nhật các đối tượng GUI từ chuỗi ban đầu. –