为什么在SWT多线程中使用管道流就会出现GUI界面卡死现象? 
我是在GUI中的styledText上显示log4j日志和Console的内容,text中的内容是可以显示的,但是整个GUI却卡死了。 
然而,我自己使用“重写打印流”的方式却没有问题。但是我又必须使用管道流才行,因为要在不同的进程之间的线程间进行数据 
读写。 晕死啊!!!! 回答前请注意: 
1,我知道如何使用Display.getCurrent().asyncExec()和syncExec()。 
2,我也知道“用户线程”和“非用户线程”的用法。或者是“前台线程”“后台线程” 的用法。 
3。管道流,log4j和GUI各部分程序本身是没有问题的。 
4。不好意思,代码很长不好贴,希望有SWT界面卡死卡死经验的帮帮忙。 
5。如果谁对SWT内部特殊“锁”的运行机制有了解,也可以讲一讲。 都一个多星期了,晕死啊!

解决方案 »

  1.   

    Display.getCurrent().asyncExec()的写法也是有区别的
      

  2.   

    什么管道流?你是否在UI Thread中使用了NewIO,即publisher/subscriber模式,如果subscriber发现“管道流”没有什么可以处理,就将当前线程(UI)block掉了,反映到图形上就是白屏。如果你是做Eclipse开发,Eclipse的core里面有Job这个封装,使用它。如果开发其它类型程序,那么新建一个线程进行运算,将结果使用Display.getCurrent().asyncExec()更新。SWT只有一个单UI线程(SWTEventDispatcher)来处理UI Object产生的各种事件,它使用Thread confinement机制,并没有什么“锁”的概念,而是处理之前检查 Thread.getCurrentThread是否在swteventdispatcher线程中,是则处理,否则报告error退出,从而达到Thread Safe效果。
      

  3.   

    判断是否适用了UI Thread很简单,加入你的操作直接或间接来自:control.addListener(SWT.eventXXX, new XXXListener(){
     public void handleEvent(EventXXX)
    {
      //some operations.在UI线程中。
    }
    });还有导致你卡死的方法中加入,System.out.println(Thread.getCurrentThread().getName()),看看是哪一个线程。如果实在不能解决,可以将代码发给我。SWT,Swing, GTK, QT等都属于单线程图形框架,还是很简单的。