在SWT中非UI线程控制界面
SWT作为一种桌面程序,一般存在两种线程,即UI线程和非UI线程。UI线程是负责生成窗口和控件的,还要负责监听事件的处理。在SWT中Display对象就是一个控制UI线程和其他线程之间的通信,负责管理队列中的事件。
我是这样理解UI线程的:当程序启动后,控件监听事件先加载,若用户不进行任何操作,那么UI线程进入等待状态。若一旦触发某个事件,例如按钮的点击事件或者本文的输入事件等,此事件就进入事件队列中。此时UI线程就处理队列中的事件。等队列中的全部事件处理完毕,则恢复等待状态。处理事件的过程就是响应用户操作的过程。
在SWT中,非UI线程不能直接操作UI控件,通常抛出的异常是:
Exception in thread "Thread-0" org.eclipse.swt.SWTException: Invalid thread access
这时,需要用通过Display对象的asyncExec(Runnable runnable)或syncExec(Runnable runnable)函数解决这个问题,更新界面。
异步代码如:
1 Display display = Display.getDefault(); 2 if (!display.isDisposed()) { 3 if (display.readAndDispatch()) { 4 Display.getDefault().asyncExec(new Runnable() { 5 @Override 6 public void run() { 7 //对控件的操作代码 8 } 9 }); 10 } 11 }
注意:这里display = Display.getDefault(),而不是调用getCurrent()。
Display.getDefault()返回的是:最近的一个UI线程中Display实例,而Display.getCurrent()返回的是:当前线程中Display实例,若当前线程是非UI线程,则返回null。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!