2013-10-29 1 views
3

안녕하세요!XPending주기가 CPU를 100 %로 만들고 있습니다

xlib 프로젝트를 만드는 데 약간의 문제가 있습니다. 여기 내 프로젝트의 구조 : 사용자가 어떤 버튼을 누르면

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

, 나는 사실 같은 값으로 스레드에서 플래그를 설정하고 창에 매 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로드가 있다는 것을 알 수는 없습니다.

답변 해 주셔서 감사합니다.

+0

Q : 당신이 만약 (XPending (warehouse.display)> 0 '으로 변경하는 경우는 동일하게 동작 하는가) {...}'? – paulsm4

+0

예, 그대로 유지됩니다 –

+0

해결책을 찾아 냈습니다. 게시물 수정, 감사합니다! –

답변

2

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); 
관련 문제