Java:无效的线程访问

时间:2012-10-25 19:24:07

标签: java multithreading swt

我是java noob程序员,我遇到SWT异常问题无效的线程访问,我已经找到了,我发现当你试图对一个不是的线程的接口项进行操作时会发生这种情况UI线程。但我不知道如何解决它。

问题: 我有4节课:

  • notify - 创建显示通知的swt窗口
  • 主要线程 - 从网上下载内容并使用通知类显示通知
  • 窗口 - 它显示托盘图标,设置,它是主类 - 它启动主线程
  • 在第二个swt窗口中显示通知的类。

问题是它因无效的线程访问而崩溃。我不知道如何显示两个swt窗口(完全不同的类)


该应用程序下载网页,解析它并获取我想要的信息。然后使用class notify 显示通知。我添加了类 Window ,它是SWT Window,它显示了托盘图标,有设置它也是主类,该类运行 ZadaneReader 线程。 第一个问题:我应该以其他方式添加SWT窗口(主要目标是:托盘图标和设置)吗?

我的应用程序包含以下类:

  • ZadaneReader - 它下载网页,解析它并使用类通知,它显示通知
  • 通知 - 该课程以2种方式显示通知: a)使用exec notify-send (但它只是以这种方式使用Ubuntu)和b)它创建对象UniNotifyWindow,这是显示通知的第二个SWT窗口
  • UniNotifyWindow - 显示自己通知的swt窗口
  • 窗口 - 设置,托盘图标,主类目前它启动其线程和ZadaneReader线程

目前:当我不使用UniNotifyWindow 时,它可以正常工作我没有使用Window(使用测试人员类启动Zadane线程)。

我认为这是一个愚蠢的问题而且我犯了很多错误,但我希望你不要责怪我,但如果你能告诉我我做错了什么,我会很高兴。

来源: https://docs.google.com/open?id=0B5VL4J_7HrgaTkt4a1Q2VVQxZEE

1 个答案:

答案 0 :(得分:2)

您只能从主(也称为“显示”)线程访问SWT UI元素。这意味着您无法在另一个线程的文本框中设置文本。推动工作显示线程的最简单方法是调用

Display.getDefault().asyncExec(...)

请注意,您在显示线程中运行的内容应该是离散的 - 长时间运行的任务会使您的UI无响应。