c - XPending 周期使 CPU 100%

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

但是这里有一些问题。 在主周期的当前实现中,我的 CPU 负载约为 100%。但是当我从代码中删除 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 负载。

感谢您的回答。

最佳答案

Alex,我已从您的问题中提取了您的答案,并将其发布在此处以供将来引用。

将循环更改为:

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

关于c - XPending 周期使 CPU 100%,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19659486/

相关文章:

c - "Access violation writing location"链表错误

c - 涉及 sin() 的两个非常相似的函数表现出截然不同的性能——为什么?

python - RabbitMQ + 昆布 : write/read to one-time use queues with random names

linux - 相当于 libSgm 的 Dial

c - 在没有运行合成器的情况下使用 x11 协议(protocol)获取覆盖窗口需要什么?

colors - 使用 C++ 更改 Xlib 窗口背景颜色

c - 从 pulseaudio 获取音量值

c - 将多个单独的字符串传递给函数

c - 在什么情况下我可能会失去对 malloc 分配的指针的访问权限?

web-services - 消息队列与 Web 服务?