1

に基づく3つのスレッドとwhile(true)ブロッキング関数を使用してアプリケーションモデルを作成しています。

  1. イベントスレッド-SDL_WaitEventによってブロックされたユーザー入力を待機します
  2. ソックスレッド-サーバーからのデータを待機し、ソケットをブロックすることでブロックされます。
  3. スレッドのレンダリング-ブロックされていないバッファからデータをレンダリングします。

スレッドのレンダリングに問題があります。たとえば、ペイントイベント(私が定義し、他の2つのスレッドのいずれかにディスパッチされる)が発生するまでブロックするブロック関数が必要です。
しかし、ブロッキング関数がどのように機能するのかわかりません。もちろん、sleep()ループを作成することはできますが、そのようなループでは、何も起こらなくてもFPSがリソースを消費するように修正されています(このトピックについては、ここですでに詳しく説明しました)。一方で、データをすぐに表示することはありません。これはGUIアプリケーションには適していません。

4

2 に答える 2

3

C ++ 11を使用している場合は、以下を使用できstd::condition_variableます std::mutex

void
waitForEvent()
{
    std::unique_lock<std::mutex> lock( myMutex );
    while ( ! externalCondition ) {
        myConditionVariable.wait( lock );
    }
}

イベントをトリガーするには:

void
setEvent()
{
    std::unique_lock<std::mutex> lock( myMutex );
    setExternalCondition();
}

一方、GUIとレンダラーについて言及します。GUIスレッドで外部条件を待つこと はできません。レンダリングのためにGUIスレッドに参加する必要がある場合は、GUIマネージャーでGUIイベントを作成する方法を確認し、GUIイベントを投稿する必要があります。

于 2013-02-04T17:42:26.493 に答える
0

いいね。マルチプラットフォームバージョンはありますか?または、少なくともLinuxに相当するので、自分で作成できますか?

このスレッドを見てください:Linuxで同等のWaitForSingleObjectとWaitForMultipleObjects

pthread_cond_timedwaitに固執し、clock_gettimeを使用します。例えば:

struct timespec ts;
clock_gettime(CLOCK_REALTIME, &ts);
ts.tv_sec += 10; // ten seconds
while (!some_condition && ret == 0)
    ret = pthread_cond_timedwait(&cond, &mutex, &ts);
于 2013-02-04T16:41:56.957 に答える