std::thread編_Dxlibの非同期処理をstd::threadやboost/coroutineでやる
std::threadってのを使ってみよう。
C++11で始めるマルチスレッドプログラミングその1 ~std::thread事始め~ - 冬でもスイカバーが食べたい
std::threadで検索すると、スレッドセーフがどーたらstd::mutexがかんたらでるけど、難しいことを覚えるのは難しいことをするときでええねん。いまからやるのはそんな難しいことじゃねえ。
std::threadの変数に関数オブジェクトを入れて、detachを呼び出すと、そのラムダ式の処理がが完全に管理外で動く。だから、自作画像ロード関数とかをstd::threadに渡してやると、勝手にホイホイやってくれる。
#include "DxLib.h" #include <iostream> #include <string> #include<future> // プログラムは WinMain から始まります int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow) { ChangeWindowMode(TRUE); if (DxLib_Init() == -1) // DXライブラリ初期化処理 { return -1; // エラーが起きたら直ちに終了 } bool volatile finished = false; int volatile progress = 0; std::thread th{ [&]()->int{ int max = 5000000; for (int i = 0; i < 5000000; i++){ auto p = new long(); delete p; progress = i * 100 / max; } finished = true; return 8; } }; SetDrawScreen(DX_SCREEN_BACK); while (ProcessMessage() == 0 && ScreenFlip() == 0 && ClearDrawScreen() == 0 && !CheckHitKey(KEY_INPUT_ESCAPE)) { if (!finished){ DrawString(30, 50, ("not yet finished:"+std::to_string(progress)).c_str(), GetColor(255, 255, 255)); } else{ DrawString(30, 50, "finished", GetColor(255, 255, 255)); } } DxLib_End(); // DXライブラリ使用の終了処理 return 0; // ソフトの終了 }
volatileってのが、変数のコンパイラ最適化を防ぐ役目があるらしい。無くてもちゃんと動く場合があるかもしれないし、あってもダメな場合があるかもしれないけど、そんな難しいことわからん。