2010-06-30 22 views
10

Tôi đang tìm cách tự động phát hiện vi phạm chính sách luồng đơn của Swing trong mã của tôi. Tôi đang tìm một cái gì đó dọc theo dòng của một số mã AOP bạn thả vào máy ảo trong khi các ứng dụng swing đang chạy và có nó đăng nhập bất kỳ nơi mà một thành phần swing được sửa đổi bên ngoài của EDT.Cách phát hiện vi phạm chính sách của chủ đề Swing

Tôi không phải là một anh chàng AOP nhưng tôi sẽ tưởng tượng tạo ra một proxy AOP xung quanh mỗi java.swing. * Lớp trông giống như

AOP_before(Method m, Object args[]) { 
if (!isEventDispatchThread(Thread.currentThread()) { 
    logStack(new RuntimeException("violation!")); 
} 

invoke(m, args); 
} 

Bất cứ ai cũng biết của một dự án hoặc tiện ích mà thực hiện điều này?

+0

Tôi đã trả lời câu hỏi như thế này trước đây và cung cấp mã AOP. Bất kỳ lời khuyên cho cách tôi đi về việc tìm kiếm nó? Tôi đã thử tìm kiếm rõ ràng, Google và SO. – mdma

+1

Tôi đề nghị chỉ cần giữ một sự tách biệt giữa mã mà nên chạy trên EDT và rằng không nên. Cố gắng tránh có các lớp kết hợp mã nên chạy trên EDT và mã nên không, ngay cả khi nó trông giống như một phím tắt. –

+0

@mdma, chỉ cần nhấp vào tên của bạn và bạn có thể thấy danh sách các câu hỏi bạn đã trả lời. –

Trả lời

7

Tôi chưa sử dụng cái này cụ thể, nhưng điều này CheckThreadViolationRepaintManager nên làm các trick.

Nó không có yêu cầu thêm:

RepaintManager.setCurrentManager(new CheckThreadViolationRepaintManager()); 

mã của bạn tuy nhiên.

+0

Cái này hoạt động khá tốt. Tôi đã tìm thấy một số vi phạm. – Justin

+0

Mã được liên kết dựa trên một số công việc trước đây của một người khác. Mã này bao gồm một liên kết đến bài đăng blog không tồn tại của anh ấy; Tôi tìm thấy một bản sao trên WaybackMachine và thấy nó là một bài đọc thú vị. Đây là một liên kết đến phiên bản lưu trữ vĩnh viễn [?] Của mục nhập blog của tác giả gốc trên giải pháp dựa trên RepaintManager. http://web.archive.org/web/20071212214347/http://www.clientjava.com/blog/2004/08/31/1093972473000.html – JVMATL

3

Tôi đã tìm thấy một bài đăng trên blog 4 năm mô tả some solutions, nhưng sẽ thực sự quan tâm nếu bạn tìm thấy một trong những phát hiện vi phạm EDT nhất. Các RepaintManager có vẻ không phải là bằng chứng đạn trong việc phát hiện tất cả các hành vi vi phạm.

+0

Có biết những trường hợp nào mà RepaintManager không phát hiện được không? – Justin

+0

Các giải pháp này trông thực sự tốt, nhưng khó thực hiện nhanh hơn. – Justin

+0

bạn vẫn có liên kết? Cái bạn cung cấp không hoạt động nữa. – peterboston

3

Vì lợi ích của hậu thế, dưới đây là phiên bản đơn giản của trình kiểm tra CheckThreadViolationRepaintManager mà TofuBeer đã tìm thấy.

RepaintManager.setCurrentManager(new RepaintManager() { 
    public synchronized void addInvalidComponent(JComponent component) { 
    check(component); 
    super.addInvalidComponent(component); 
    } 
    public void addDirtyRegion(JComponent component, int x, int y, int w, int h) { 
    check(component); 
    super.addDirtyRegion(component, x, y, w, h); 
    } 
    private void check(JComponent c) { 
    if(!SwingUtilities.isEventDispatchThread() && c.isShowing()) { 
     new Throwable("EDT required!").printStackTrace(); 
    } 
    } 
}); 

Chỉ cần gọi trong phương thức chính của bạn và bạn sẽ nhận được stacktraces được ghi lại bất cứ khi nào các thành phần được thay đổi trên chủ đề không phải EDT.

Các vấn đề liên quan