Eclipse RCP:Display.getDefault().asyncExec 仍然阻止我的 GUI

发布于 2024-12-11 13:36:11 字数 293 浏览 0 评论 0原文

我有一个简单的 viewPart,提供一些文本字段来输入硒测试的参数。填写这些字段后,用户可以开始测试,大约需要时间。需要 30-45 分钟运行。我希望我的 GUI 在测试期间保持活动状态,让用户有机会做其他事情。我需要一个进度监视器。

我尝试将硒测试放入包含 Display.getDefault().asyncExec 的作业中来运行它。但是我的 GUI 在显示繁忙指示符几秒钟后就冻结了。除了进度监视器之外,selenium 不会更新任何其他视图。

有没有其他方法可以确保该作业不会阻塞我的 GUI?

最好的, 米尔科

I have a simple viewPart offering some text fields to enter parameters for a selenium test. After filling out these fields the user may start the test which approx. needs 30-45 minutes to run. I want my GUI to be alive during this test giving users the chance to do other things. I need a progress monitor.

I tried to put the selenium test in a job containing Display.getDefault().asyncExec to run it. But my GUI freezes after some seconds giving the busyindicator. The selenium does not update any other view but the progress monitor.

Is there another way to ensure that the job wont block my GUI?

Best,
Mirco

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

只为守护你 2024-12-18 13:36:11

(a)syncExec 中执行的所有内容都使用显示线程,因此会阻塞您的 UI,直到它返回。我建议您使用 Eclipse 作业。这将使用工作台已经提供的开箱即用的进度指示器。

Everything executed in (a)syncExec is using the display thread and therefore blocking your UI until it returns. I suggest you use Eclipse Jobs. This will use the progress indicator that the workbench already offers out of the box.

我一向站在原地 2024-12-18 13:36:11

我建议将代码拆分为更新 UI 的代码和执行其他业务的代码。在单独的线程中执行所有操作,当您需要检索或设置 UI 的某些操作时,请使用“Display.getDefault().asyncExec”。

Thread thread = new Thread("Testing") {

    // some shared members

    public void run() {

        someBusiness();

        // or use syncExec if you need your thread
        // to wait for the action to finish
        Display.getDefault().asyncExec(new Runnable() {

            @Override
            public void run() {
                // UI stuff here
                // data retrieval
                // values setting
                // actions trigging 
                // but no business
            }

        });
        someBusiness();

};
thread.start();

I would suggest to split your code into code that updates the UI and the code that executes other business. Execute all of it in a separate thread, and when you need to retrieve or set some action to the UI then use the "Display.getDefault().asyncExec".

Thread thread = new Thread("Testing") {

    // some shared members

    public void run() {

        someBusiness();

        // or use syncExec if you need your thread
        // to wait for the action to finish
        Display.getDefault().asyncExec(new Runnable() {

            @Override
            public void run() {
                // UI stuff here
                // data retrieval
                // values setting
                // actions trigging 
                // but no business
            }

        });
        someBusiness();

};
thread.start();
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文