我在做一个IM软件,客户端程序里设了一个计时器,用来检查信号量a,一旦有好友对你发出聊天邀请,a就改变值,这时计时器会立刻捕捉到a,同时触发一个新的聊天界面和你进行会话。现在的问题是在计时器线程中创建了UI子线程后,按理应该是异步的(为保险起见我还是用display.asyncExec启动的这个UI子线程),结果此时计时器线程停了!!在等我把会话窗体dispose掉它才继续计时。也就是说一旦这时别的好友对你发出新的聊天请求,改变a值,计时器是观察不到的。究竟该怎么处理?要说我为什么要用这么蛋疼的计时器监听一个变量a值的改变,是因为我其实就是想实现多线程会话通知打开新窗体的功能。我用传统方法打开会话窗体,java说我无权在子线程中访问UI线程(invalid access thread);我把处理函数写在主线程的类里调用,结果还是无权;我又试着用Observer模式监听,按理Observer模式应该脱离于线程机制,可是Observer居然还是告诉我无权访问。我真的慌了。。各位,究竟该怎办???

解决方案 »

  1.   

    GUI应用中,UI本身包括界面刷新、事件处理啥的都是单线程,而且其它线程不允许直接操作UI控件(访问其它属性可以),只能由UI自己的那个线程来操作。所以多线程情况下,只能去通知UI线程做某件事情。
    不知道你系统结构,建议是:
    UI和通讯、消息模块分开,通讯负责收发Socket信息然后交给消息模块,消息模块应该担当各类事件的总控,UI就是老老实实的负责显示就行了。
      

  2.   

    这个有用!可是按你说的,我还是必须在消息模块控制UI啊?!至少我得把通讯模块得到的信息传到UI上显示,而且还得更新UI的显示内容,这些依然无权啊?!
      

  3.   

    要通过事件机制来回调,说白了就是:写段代码,通知GUI线程来调用这段代码。Swing里面用:
    invokeLater(Runnable run) 或者 invokeAndWait(Runnable run)SWT似乎是:
    Display.syncExec 和 Display.asyncExec