【问题标题】:Eclipse RCP application - how to detect when application is idle?Eclipse RCP 应用程序 - 如何检测应用程序何时空闲?
【发布时间】:2011-06-04 01:28:53
【问题描述】:

我正在编写一个 Eclipse RCP 应用程序,它除了我自己的插件之外还有其他插件贡献,并且需要确定应用程序何时空闲(即一段时间内没有活动,应用程序被最小化等),以及何时空闲更改(即应用程序回到前台,单击鼠标等)。

我遇到的问题是我要捕获所有应用程序击键和鼠标移动/点击...使用它来重置计时器,当计时器被击中时,可能会发生一些空闲处理(即通知闲置的服务器 - 然后当我们切换到活动时再次 - 没什么密集的)。但是,应用程序窗口外壳不接收各种视图等的子事件,所以要么我遗漏了什么,要么这是错误的方法。

谁能提供解决方案?我不是在寻找系统范围的空闲 - 只是应用程序空闲。

谢谢。

【问题讨论】:

    标签: java eclipse eclipse-rcp rcp


    【解决方案1】:

    Eclipse IDE 已经有类似执行垃圾回收的功能,看看 Bundle org.eclipse.ui.ide.application 中的 org.eclipse.ui.internal.ide.application.IDEIdleHelper 类

    【讨论】:

    • 谢谢 - 这个课程证实了 mtraut 上面所说的。
    【解决方案2】:

    也许吧

        display.addFilter(SWT.MouseDown, new Listener() {
            @Override
            public void handleEvent(Event event) {
            }
        });
    

    是您要查找的内容(您也可以添加其他事件)?

    这是在事件处理完成之前执行的组件明智...

    但是一般不推荐使用它——它应该是一个非常受限的用例,所以。

    【讨论】:

    • 我认为这就是我要走的路。不理想,我同意。我曾希望避免这个电话,因为它可能很危险。我还使用垃圾收集代码作为保持紧密的示例(请参阅下面的第三个响应)。
    【解决方案3】:

    您可以使用readAndDispatch 方法将在没有更多消息要处理时返回false 的事实。像这样的:

    long lastActivityAt = 0;
    int idleThresholdSecs = 5;
    while (true)
    {
        while (display.readAndDispatch())
        {
            lastActivityAt = System.nanoTime();
        }
    
        if (System.nanoTime() - lastActivityAt > idleThresholdSecs * 1000 * 1000 * 1000) 
        {
            // we have been idle for at least "idleThresholdSecs"
            ...
        } 
        else
        {
            Thread.sleep(50);
        }
    }
    

    【讨论】:

    • 我喜欢这个。你已经用过这个模式了吗?问题是是否有一些“技术”事件在没有真正的用户交互的情况下被处理?
    • 我没有用它来检测空闲,但是我在需要手动处理主线程中的事件而不释放它的控制权的情况下使用它。
    猜你喜欢
    • 1970-01-01
    • 2019-11-07
    • 2012-06-22
    • 2022-01-19
    • 1970-01-01
    • 1970-01-01
    • 2017-03-13
    • 1970-01-01
    相关资源
    最近更新 更多