XPending周期使CPU 100%

美好的一天!

我有一些麻烦制作一个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负载。

谢谢你的回答。

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

将循环更改为:

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