2

ここでCの初心者ユーザー。

X11 / Xlibを使用してCでライブラリを構築しようとしているので、小さなプロジェクトにのみ使用できます。イベントを処理してユーザーからの入力(ボタンの押下とキーの押下)を取得しようとすると、問題が発生します。しばらくは正常に動作し、その後、時間の経過とともに大幅な遅延が発生し始めます。

今私が持っているのは、待機中のイベントがあるかどうかをチェックし、ある場合はそれを取得するプログラムです。

今の私の問題は、イベントがメモリに保存され、プログラムが停止していることだと思います。しかし、それは単なる推測です。

どんな助けでもありがたいです。ありがとうございました。

編集:コードを忘れた(私は何かを忘れたことを知っていた)

問題の2つの関数は次のとおりです。

int event_waiting()
{
    XEvent event;

    if(XCheckMaskEvent(dspy,-1,&event)) {
        if(event.type==KeyPress) {
            XPutBackEvent(dspy,&event);
            return 1;
        } else if (event.type==ButtonPress) {
            XPutBackEvent(dspy,&event);
            return 1;
        }
    } /* <<=== added missing close-curly here */
    return 0;
}

char wait()
{
    XEvent event;
    XNextEvent(dspy,&event);
    if(event.type==KeyPress) {
        saved_x = event.xkey.x;
        saved_y = event.xkey.y;
        return XLookupKeysym(&event.xkey,0);
    } else if(event.type==ButtonPress) {
        saved_x = event.xkey.x;
        saved_y = event.xkey.y;
        return event.xbutton.button;
    }
}

そして、彼らは主にそのように呼ばれます、

if (event_waiting()){
  char c = wait();
  //Switch case goes here
}

編集2:更新されたコード

XEvent event;
if(XCheckMaskEvent(display,-1,&event)) 
{
    if(event.type==KeyPress) {
        XPutBackEvent(display,&event);
        return 1;
    } else if (event.type==ButtonPress) {
        XPutBackEvent(display,&event);
        return 1;
    }
}
XFlush(display);
return 0;

`

4

1 に答える 1

1

時間の経過とともに悪化するラグは、イベントキューに手つかずのイベントが多数あることを意味し、速度が低下しXCheckMaskEvent()ます。

を使用してイベントを指定し、関心のあるイベントがない場合はXSelectInput(... ButtonPressMask | KeyPressMask)を使用してイベントキューをフラッシュしてみてください。XFlush()

    if(event.type==KeyPress) {
        XPutBackEvent(dspy,&event);
        return 1;
    } else if (event.type==ButtonPress) {
        XPutBackEvent(dspy,&event);
        return 1;
    } else {
        XFlush(dspy); // this
    }
于 2012-12-05T01:11:11.600 に答える