2

良い一日!

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 負荷を持っていることがわかりません。

回答ありがとうございます。

4

1 に答える 1

2

アレックス、私はあなたの質問からあなたの答えを引き出し、将来の参考のためにここに投稿しました.

ループを次のように変更します。

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);
于 2013-12-10T20:20:29.467 に答える