【问题标题】:Suspending application that have open menu freezes unix desktop暂停具有打开菜单的应用程序会冻结 unix 桌面
【发布时间】:2015-03-11 11:29:12
【问题描述】:

我有这个应用程序,当它达到某个 cpu 使用阈值时会暂停应用程序。我现在的问题是当我暂停当前打开菜单的应用程序时,它会冻结整个 Centos 桌面。有没有办法在我挂起之前以编程方式取消应用程序的打开菜单?

我的应用程序是用 c++ 编写的,所以我可以使用 xlib/x11,但我似乎无法取消其他应用程序的菜单。我已经使用了 XRaiseWindow() 和假键事件,但菜单仍然无法触摸。

【问题讨论】:

  • 你为什么要使用一个工具来暂停interactive GUI 应用程序,当它们使用 CPU 时?首先它看起来是错误的。如果您编写了该工具,它如何暂停这些?远程应用程序(例如以ssh -X -f remotehost xterm 开头的远程终端)呢?
  • 您是否花了很多时间阅读EWMH
  • 您好,感谢您的回答/问题?我用kill -stop <pid>。我是 unix 的初学者,所以我只是写了这个应用程序进行实验。我试图在应用程序使用超过 50% 的 cpu 使用率时暂停应用程序,然后遇到这种情况。我还没读过,我去看看。谢谢
  • 那么不要挂起你的应用程序:要么kill(2)它(如果它在本地运行!)它与SIGTERM(见signal(7)...)或使用setpriority(2)就像@ 987654325@ 可以。

标签: linux unix x11 xlib suspend


【解决方案1】:

这是 X11 的一个已知问题。您不能轻易取消其他应用程序的菜单。但是,您可以检查菜单或类似项目是否处于活动状态。为此,请致电 XGrabKeyboardXGrabPointer。如果两个调用都成功,您可以暂停您的应用程序。如果没有,请致电XUngrabPointerXUngrabKeyboard,等待重试。完成后始终取消抓取。

示例代码,尝试正常运行,然后在菜单处于活动状态时运行。

#include <stdio.h>
#include <X11/Xlib.h>

int main ()
{
    Display* d = XOpenDisplay(NULL);

    int res = XGrabKeyboard(d, DefaultRootWindow(d), True, GrabModeAsync, GrabModeAsync, CurrentTime);
    if (res == Success)
    {
        int res = XGrabPointer(d, DefaultRootWindow(d), True, 0, GrabModeAsync, GrabModeAsync, None, None, CurrentTime);
        if (res == Success)
        {
            printf ("Grabbed!\n");
            // suspend app here
            XUngrabPointer(d, CurrentTime);
        }
        else
            printf ("Could not grab pointer\n");
        XUngrabKeyboard(d, CurrentTime);
    }
    else
        printf ("Could not grab keyboard\n");
    return 0;
}

【讨论】:

  • 谢谢!我试过这个,但是当其他应用程序打开菜单时,我无法取消键盘和指针。我什至尝试将其置于 while 循环中,以便它可以等待并重试,但菜单仍然位于顶部。
  • 您无法在不终止应用程序的情况下中断抓取。这就是重点。
  • 我最小化应用程序怎么样?这是可能的还是会发生同样的行为?
猜你喜欢
  • 1970-01-01
  • 2022-10-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多