最近在学习swt的东西,遇到一个问题,特转录如下。 SWT异常: org.eclipse.swt.SWTException: Invalid thread access 在创建SWT界面的线程之外的线程中尝试去修改界面元素.将抛出以下异常 Exceptioninthread"Thread-0"org.eclipse.swt.SWTException:Invalidthreadaccess atorg.eclipse.swt.SWT.error(SWT.java:2942) atorg.eclipse.swt.SWT.error(SWT.java:2865) atorg.eclipse.swt.SWT.error(SWT.java:2836) 上述Thread-0是另外开启的一个线程. 【解析】: 在SWT程序中, SWT会自动创建一个用户界面线程 非用户界面线程不能直接操作用户界面线程 要想在另外一个线程中尝试修改用户界面,应采用一下方法: if(!this.display.isDisposed()){ Runnablerunnable=newRunnable(){ publicvoidrun(){ //你改界面的代码 } }; display.syncExec(runnable);//关键在这一句上(同步调用,等待主界面线程处理完成之后) } swt-doc中的说明: public void syncExec(java.lang.Runnable runnable)Causes the run() method of the runnable to be invoked by the user-interface thread at the next reasonable opportunity. The thread which calls this method is suspended until the runnable completes. Parameters: runnable - code to run on the user-interface thread. (同步调用,需要等待主界面处理完成之后,才能继续) 此外,与之对应的另一个方法: public void asyncExec(java.lang.Runnable runnable)Causes the run() method of the runnable to be invoked by the user-interface thread at the next reasonable opportunity. The caller of this method continues to run in parallel, and is not notified when the runnable has completed. Parameters: runnable - code to run on the user-interface thread. (异步调用,不等待主界面线程处理结果)
怎么解决SWT多线程错误:Caused by: org.eclipse.swt.SWTException: Invalid thread access 我这几天研究JAVA做MSN,下载的示例都是在控制台下显示的,现在要做一个桌面MSN,要在界面上显示运行情况,比如,登录时,在文本框中显示"正在登录,请稍后....",登录成功后显示"登录成功....."等,以及其它一系列事件都要在界面上显示.. 我用的是SWT Designer来做界面的,界面上有账号和密码输入框,登录及退出按钮,以及显示运行刻录的文本框. 现 在只是做了登录,要在文本框里显示登录情况,网上的代码都是通过System.out.println在控制台里显示,而现在我要将记录显示在文本框里, 开始时,我就直接按照调用类方法的办法调,可是总出现Caused by: org.eclipse.swt.SWTException: Invalid thread access这个错误,我查询后知道,这是因为SWT界面线程不能在其它线程里进行操作等. 由于以前没做过JAVA桌面程序,也没做过JAVA多线程,所以花了我一天多的时间,都没搞定.下午,在utopian的帮助下,才搞定,太多的道理我也说不清,呵呵,我对JAVA也不是很熟悉,只是在JSP里用到了点皮毛而已.我只说一下我的最后解决方法 我就是在那个新线程(其实是一个处理监听事件的接口对象)需要修改界面的地方,那一段代码包起来,比如在我这个MSN的处理对象中,有一个消息是登录成功的消息 原来在控制台下显示消息的代码: /** * 登录成功后执行该方法 */ public void loginComplete(MsnFriend own) { System.out.println(own.getLoginName() + " Login OK"); } 而想要界面里显示,则改成: /** * 登录成功后执行该方法 */ public void loginComplete(MsnFriend own) { Display.getDefault().syncExec(new Runnable() { public void run() { allTxt.setText("登录成功...."); } }); } 开始我只是写了allTxt.setText("登录成功....");这行代码,就一直报那个错,后来,改成 Display.getDefault().syncExec(new Runnable() { public void run() { allTxt.setText("登录成功...."); } }); 这样就没问题了,也就是说,在非SWT线程的线程里想要修改SWT界面,都要通过上面类似的办法来做,不然就会报错的 呵呵,就是这样,问我为什么,我也说不清,呵呵,也不敢乱说,怕误人子弟啊,如果你知道的话,就详细一点告诉我吧,也让大家来学习和分享你的知识
相关推荐
Invalid Thread Access(亲测可用).md
当开发者尝试在非UI主线程中直接访问或修改SWT组件时,就会触发`SWTException`异常,具体错误信息为“Invalid thread access”。 例如,在上述代码片段中,`SWTMainWin`类的`createControl`方法中创建了一个新的...
项目中碰到的问题
Invalid Vector Access(处理方案).md
invalid memory access(解决方案).md
Invalid Memory Access(亲测可用).md
### 多线程技术在VC++串口通信程序中的应用研究 #### 一、引言 随着计算机技术的发展,多线程技术已成为提高系统性能的关键手段之一。在串口通信领域,合理运用多线程技术可以有效提升数据传输效率及程序响应能力...
总结来说,“Lock及多线程ATM取款实例”是一个关于在C#中如何利用`Lock`实现线程安全,同时结合异步编程提高性能的实例。通过合理的线程同步和异步处理,我们可以构建出高效且安全的多线程应用,确保在并发环境下...
多线程Socket阻塞模式下通信的例子 BCB-Socket阻塞模式通讯测试(多线程) 作者:Sncel(地狱情人) QQ:6522203 指导:invalid(空心菜) QQ:309283 http://bcb.vicp.net 测试方法: 在单机上测试: 如果有多个客户...
在Windows 9X/NT等操作系统中,多线程机制允许单个程序同时执行多个独立的任务或操作流(线程)。每个线程可以独立运行,互不影响。系统负责调度各个线程占用CPU的时间片,使得它们看起来像是并行执行的一样。这样做...
在Windows系统中,I/O完成端口(IOCP,Input/Output Completion Port)是一种高效的多线程并发处理I/O操作的技术。它允许开发者利用多个处理器来处理I/O请求,极大地提高了程序的性能。本篇文章将重点讲解如何在VC8...
Invalid State Key Access(解决方案).md
invalid flash memory access(解决方案).md
在Windows操作系统环境中,多线程编程是开发高效应用程序的关键技术之一。它允许程序同时执行多个独立的任务,从而充分利用多核处理器的性能。本篇将详细探讨如何在Windows窗口下实现多线程,以及如何使用 `_...
项目中碰到的问题
《Access_JDBC30.jar:突破访问限制与修复执行异常》 在IT行业中,数据库连接是应用程序与数据交互的关键环节。Microsoft Access作为一个广泛使用的数据库管理系统,其JDBC驱动程序为Java开发者提供了与Access...
在 Java 5.0 之前,多线程编程主要依赖于 `Thread` 类、`Runnable` 接口以及对象的 `wait()`、`notify()` 和 `notifyAll()` 方法来实现同步和通信,这些方法虽然能够满足基本需求,但在实际开发过程中存在着不少局限...
### Win32多线程(1):C语言下的基础知识 #### 一、引言 在探讨Win32多线程之前,我们首先要明确一点,那就是多线程并不是C++语言本身特性的一部分,而是通过各个操作系统提供的API实现的。本文将重点介绍在...
在本文中,我们将深入探讨如何使用Windows多线程和Winsock库来实现一个TCP并发服务器。TCP并发服务器是指能够同时处理多个客户端连接请求的服务端程序,这种能力是通过多线程技术来实现的。 首先,我们需要引入必要...