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