首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >SWT、多线程和异常

SWT、多线程和异常
EN

Stack Overflow用户
提问于 2016-08-06 06:22:50
回答 2查看 409关注 0票数 0

我在一个主GUI程序中使用SWT。在其中,我创建了另一个线程来运行一些程序。但是,如果在这些过程中遇到一些错误,我想通过显示一个消息框来报告给用户。因为在SWT中,只有一个线程可以执行GUI操作,所以我让程序运行器抛出异常,这样GUI线程就可以处理它们。但是,我遇到了问题,因为我为程序运行器创建了一个新线程(为了不阻塞GUI线程,该线程将不断更新和刷新一些图形),但结果是,发生的异常作为该线程的一部分被卡住,无法创建错误消息框。对如何处理这个问题有什么建议吗?

代码语言:javascript
运行
复制
private void goButtonActionPerformed()
{
    // create the program runner object
    ProgramRunner PR = new ProgramRunner(); // real code passes in data to be used

    try{
        // check all necessary parameters are entered
        boolean paramsOK = PR.checkParams();
        if (paramsOK)
        {
            // all necessary information is available.  Start Processing.
            Thread t = new Thread() {
                public void run()
                {
                    try{
                        PR.runPrograms();
                    }
                    catch (IOException iox)
                    {
                        // This does not work to catch & display the exceptions 
                        // which took place in PR.runPrograms(), because this 
                        // thread is not allowed to perform GUI operations.  
                        // However, I don't know how to pass this 
                        // exception / error notification out of this thread.
                        MessageBox mb = new MessageBox(m_Shell, SWT.ICON_ERROR);
                        mb.setMessage(iox.getMessage());
                        mb.open();
                    }
                }
            };
            t.start();
        }
    } 
    catch (IOException iox)
    {
        // this works to catch & display the exceptions which took place 
        // in PR.checkParams() because that is not a separate thread
        MessageBox mb = new MessageBox(m_Shell, SWT.ICON_ERROR);
        mb.setMessage(iox.getMessage());
        mb.open();
    }
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-08-06 09:27:17

将捕获逻辑包装在Display.getDefault().asyncExec中,以显示UI线程上的错误消息:

代码语言:javascript
运行
复制
Thread t = new Thread()
{
   public void run()
   {
        try
        {
            PR.runProgram();
        }
        catch ( final IOException iox )
        {
             Display.getDefault().asyncExec( new Runnable()
             {
                 public void run()
                 {
                     MessageBox mb = new MessageBox(m_Shell, SWT.ICON_ERROR);
                     mb.setMessage(iox.getMessage());
                     mb.open();

                 }
             });

        }
   }
});

t.start();

然后可以在UI线程中显示异常。

票数 1
EN

Stack Overflow用户

发布于 2016-08-06 15:24:04

您需要安排UI代码在UI线程中运行。您可以使用DisplayasyncExecsyncExec方法来完成此操作。

syncExec挂起当前线程,直到UI代码运行。asyncExec不挂起线程,并尽快运行UI代码。

您可以使用Display.getDefault()在任何线程中获取当前显示,因此您可以执行以下操作:

代码语言:javascript
运行
复制
Display.getDefault().asyncExec(() ->
 {
   if (m_Shell != null && !m_Shell.isDisposed()) {
     MessageBox mb = new MessageBox(m_Shell, SWT.ICON_ERROR);
     mb.setMessage(iox.getMessage());
     mb.open();
   }
 });

我在这里对Runnable使用了Java8lambda表达式,因为它比传统方法更短。

因为这段代码是异步运行的,所以最好检查shell是否为空并且没有被释放。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/38798511

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档