美好的一天!
我在制作 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/