2010-06-30 15 views
10

Swing'in tek iş parçacıklı ilkesinin benim kodumdaki ihlallerini algılamanın otomatik bir yolunu arıyorum. Döndürme uygulaması çalışırken VM'ye düşürdüğünüz bazı AOP kodlarının satırları boyunca bir şey arıyorum ve EDT'nin dışında bir swing bileşeninin değiştirildiği herhangi bir yeri günlüğe kaydedelim.Salıncak iş parçacığı ilkesi ihlallerini saptama

Ben bir AOP adam değilim ama ben her java.swing etrafında bir AOP vekil yaratarak hayal ediyorum. *

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

invoke(m, args); 
} 

Herkes bunu yapar bir proje veya yardımcı program biliyor gibi görünüyor sınıfını?

+0

Daha önce böyle bir soruyu yanıtladım ve AOP kodu sağladı. Bulmak için nasıl gittiğime dair ipuçları var mı? Açık, Google ve SO aramalarını denedim. – mdma

+1

Sadece EDT'de çalışması gereken ve olmaması gereken kodlar arasında temiz bir ayrım yapılmasını öneriyorum. EDT'de çalıştırılması gereken kodları birleştiren sınıflardan ve kısayol gibi görünse bile olmaması gereken kodlardan kaçınmayı deneyin. –

+0

@mdma, isminizi tıklayın ve cevapladığınız soruların listesini görebilirsiniz. –

cevap

7

Bu özel birini kullanmadım, ancak bu CheckThreadViolationRepaintManager numarayı yapmalıdır.

Bu ekleme gereksinimi var: ancak kodunuza

RepaintManager.setCurrentManager(new CheckThreadViolationRepaintManager()); 

.

+0

Bu, oldukça iyi çalıştı. Zaten bazı ihlaller buldum. – Justin

+0

Bağlantılı kod başka bir erkeğin önceki çalışmalarına dayanmaktadır. Kod, varolmayan blog gönderisine bir bağlantı içerir; WaybackMachine üzerinde bir kopya buldum ve ilginç bir okuma olduğunu buldum. Burada, orijinal yazarın RepaintManager tabanlı çözümüyle ilgili blog girişinin kalıcı olarak [?] Arşivlenmiş sürümüne bir bağlantı var. http://web.archive.org/web/20071212214347/http://www.clientjava.com/blog/2004/08/31/1093972473000.html – JVMATL

3

some solutions belgesini açıklayan 4 yaşında bir blog yazısı buldum, ancak çoğu EDT ihlalini tespit eden bir ürün bulursanız gerçekten ilgi çekici olurdum. Tüm ihlalleri tespit etmede RepaintManager'ın kurşun geçirmez olmadığı görülüyor.

+0

RepaintManager'ın ne tür vakaları tespit edemediği biliniyor mu? – Justin

+0

Bu çözümler gerçekten iyi görünüyor, ancak hızlı bir şekilde uygulanması daha zor. – Justin

+0

Hala bağlantınız var mı? Sağladığınız kişi artık çalışmıyor. – peterboston

3

Gelecek için aşk, TofuBeer'in bulduğu CheckThreadViolationRepaintManager'ın basitleştirilmiş bir sürümü.

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(); 
    } 
    } 
}); 

Sadece ana yönteminde böyle hitap ve bileşenleri olmayan EDT parçacığı değiştirildi ediliyor ne zaman stacktraces açmış alırsınız.

İlgili konular