【问题标题】:XPending cycle is making CPU 100%XPending 周期使 CPU 100%
【发布时间】:2013-11-08 16:23:06
【问题描述】:

美好的一天!

我在制作 xlib 项目时遇到了一些麻烦。这是我的项目的结构:

[ Init ]
[ Making some stuff ]
[ Creating a timer thread (see code below) ]
[ Main cycle (see code below) ]

当用户按下任何按钮时,我将线程中的标志设置为类似 true 的值,并且它开始每 n 次向窗口发送 CustomMessage。

while (warehouse.destroyflag != SML_DEAD)
{
    if (XPending(warehouse.display))
    {
        XNextEvent(warehouse.display, &event);

但是这里有一点问题。 随着当前主循环的实现,我有大约 100% 的 CPU 负载。但是当我从代码中删除 XPending 行时,负载大约为 0%。但在这种情况下,我没有正确的 CustomMessage 从另一个线程到达。

我找到了Xlib程序的示例代码并编译了它。它有同样的问题,CPU负载大约是100%。这是示例:

http://paste.bradleygill.com/index.php?paste_id=4897

这是我的线程代码: http://paste.bradleygill.com/index.php?paste_id=4898

这是我的周期: http://paste.bradleygill.com/index.php?paste_id=4899

我阅读了 GTK+ 项目代码,发现它具有非常相似的周期,但我看不到任何 GTK+ 应用程序因此具有 100% 的 CPU 负载。

感谢您的任何回答。

【问题讨论】:

  • 问:如果你换成if (XPending(warehouse.display) > 0) {...},行为是否一样?
  • 是的,它保持不变
  • 刚刚找到解决方案。已编辑帖子,谢谢!
  • @AlexTiger 将解决方案显示为答案 不要编辑问题

标签: c message-queue x11 xlib


【解决方案1】:

亚历克斯,我已从您的问题中提取了您的答案,并将其发布在此处以供将来参考。

将循环改为:

while (warehouse.destroyflag != SML_DEAD)
{
    while (XNextEvent(warehouse.display, &event) >= 0)
    {

和线程代码:

XLockDisplay(warehouse.display);
{
     XSendEvent(warehouse.display,
                event.xclient.window,
                0, NoEventMask, &event);
     XFlush(warehouse.display);
}
XUnlockDisplay(warehouse.display);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-08-01
    • 1970-01-01
    • 2017-11-28
    • 1970-01-01
    • 1970-01-01
    • 2015-09-27
    相关资源
    最近更新 更多