4

C++11 スレッドを試す開発を行っています。非同期スレッドでいくつかのコードを実行したいのですが、そのコードが完了したら、メイン スレッドで他のコードを実行したいと考えています

これは、非同期で実行したいのは OpenGL のものをロードしているためであり、スレッドを実行するときに OpenGL コンテキストを使用するのは少し難しいためです。私が知る限り、異なるスレッドで同じコンテキストを実行しないでください。

ただし、collada ファイルをロードするローダー スレッドを作成したいと思います。ここで実際に時間のかかる作業は、ファイルを解析してデータをセットアップすることであり、(技術的に) 別のスレッドで実行できるすべてのことを行います。メイン スレッドでの opengl 固有のタスク。(これは私の最初の考えであり、間違った方法で進んでいる可能性があります)..

したがって、1 つのスレッド非同期をデタッチして collada ファイルをロードし、データを入力することができれば、それが完了したら、メイン スレッドで呼び出してバッファーをバインドし、シェーダーをセットアップするなどを行うことを考えています。私はスレッドなしでそれを行うことができますが、GL がおかしくなることなく、バックグラウンドで新しいデータをロードするのはかなりスムーズです..

そこで、やりたい手順を並べてみます。

  1. メインスレッドは、それが行うことを実行します...
  2. 誰かが新しいメッシュをロードするように要求します
  3. 非同期スレッドを作成し、その中に collada データをロードすることによって初期化されたメッシュ
  4. その間、メインスレッドはそれを実行し続けます
  5. collada の読み込みが完了すると、非同期スレッドは、メイン スレッドで追加の読み込み (つまり、セットアップ バッファーなど) を行うことをメイン スレッドに通知します。
  6. 設定が完了し、メッシュがレンダー キューに追加されます

私はそれをすべて同期的に動作させています。私が望むのは、切り離された非同期スレッドが終了したら、いくつかのことを行う方法です。

ここでの私の考えに対する任意のアイデアまたはもちろん建設的な批判:P は温かく歓迎されます! 私はそれについてすべて間違った方法で考えているかもしれません.オブザーバーパターンのようなことを考えていましたが、最善の方法でそれに取り組む方法が本当にわかりません. OpenGL のものをスレッド化してもかまいませんが、トラブルを求めているように思えます..

4

1 に答える 1

6

あなたのユースケースを正しく理解していれば、操作が実際に別のスレッドで開始されることを確認するポリシーstd::async()で開始された関数は、あなたが望むことだけを行うと思います:std::launch::async

// Your function to be executed asynchronously
bool load_meshes();

// You can provide additional arguments if load_meshes accepts arguments
auto f = std::async(std::launch::async, load_meshes); 

// Here, the main thread can just do what it has to do...

// ...and when it's finished, it synchronizes with the operation
// and retrieve its result (if any)

bool res = f.get(); // res will hold the return value of load_meshes,
                    // or this will throw an exception if one was
                    // thrown inside load_meshes()

if (res) 
{ 
    // ... and then it will go on doing the remaining stuff on the main thread
}

ここで気をつけなければならないことの 1 つは、 の戻り値を(タイプ の)std::async()変数に割り当てる必要があることです。ここで、 はによって返されるタイプです。そうしないと、メイン スレッドが終了するまで待機することになります(したがって、あたかも関数がメイン スレッドで呼び出されたかのようになります)。std::future<T>Tload_meshes()load_meshes()

于 2013-02-22T23:45:57.037 に答える