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