XPending周期使CPU 100%

时间:2013-10-29 13:24:58

标签: c message-queue x11 xlib

美好的一天!

制作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负载。

感谢您的回答。

1 个答案:

答案 0 :(得分:2)

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

将循环更改为:

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);