2011-05-16 106 views
1

对不起,这个问题有点含糊,但我一直没能从调试中得到任何有用的信息。黑莓 - 线程无响应

我有一个线程,我打电话使用新的Thread()开始,那么它会为AA短的时间内运行,我收到此消息:

未捕获的异常:应用程序“我的应用程序 名(201 )“没有响应;过程 终止

现在什么是令人沮丧的是我能够运行相同的过程,但不带螺纹,然后锁定了我的申请,但我可以从我的Eclipse控制台,它的工作看没有错误。所以我知道他们不是我在线程上使用的函数的错误。

我想也许这个问题可能与我一起使用“InvokeLater”函数来更新与线程进度我的GUI,我发送这个很难,我担心它摧毁我的线程。

有什么建议吗?

要在我的岗位扩大,这个问题是因为我从我的其他线程中调用这个代码ALOT: -

invokeLater(new Runnable() 
     { 
      public void run() 
      { 
       _output.setText(_output.getText() + "\n" + msg); 
      } 
     }); 

这是建立一个队列,迅速崩溃我的应用程序。

我的选择的解决方案是通过将此代码添加到我的函数使用事件线程: -

synchronized(Application.getEventLock()) { 
     _output.setText("new text " + System.currentTimeMillis()); 
    } 
+2

您可能需要发布一些代码来显示您的主题。 – 2011-05-16 20:51:20

+0

你确定你正在使用invokeLater()而不是invokeAndWait()吗?在我使用自动完成功能之前,我陷入了这个问题。另外我同意NGAC,一些代码会非常有帮助。 – jprofitt 2011-05-16 21:25:42

+0

根据您的编辑,我想指出您的原始代码是二次的,而替换代码是线性的,所以您无法在性能上进行比较。 – 2011-05-17 16:26:33

回答

1

你说得对:

我想也许这个问题可能和我躺在一起使用“的invokeLater”功能来更新我的线程进展GUI,我滥发这相当困难,我担心它破坏我的线程。

调用InvokeLater立即返回,队列工作供UI线程执行。问题是,如果该队列变得太大,操作系统将会终止你的应用程序,假设UI已经陷入了无法为队列服务的程度。

我以前用来解决这个问题的解决方案是将发送到UI线程的工作分块。制作某种累加器对象,布尔标志和锁。工作者线程然后抓住锁并将工作添加到累加器。布尔标志指示UI工作者代码是否计划在将来清空累加器。如果没有,请安排您的UI更新代码。

在UI更新代码中,您抓住锁并尽快将数据从累加器中移出,并将布尔值标记为false,以显示不再有UI工作人员计划清空累加器。

+0

谢谢,这似乎是问题,我会开始处理你现在的建议。 – Demonofloom 2011-05-17 09:03:56

1

如果是一些对象的线程内,而做一些耗时的同步,并且如果你的UI线程尝试在同一个对象上进行同步,它会阻塞,直到释放锁。

0

它可能是一个死锁,尤其是如果你延长超时并仍然看到它。你可以采取线程转储并查看UI线程正在做什么。如果它正在等待获得锁定,那么您可能想要朝这个方向挖掘。