人生初心者の雑記

すべてにおいてド素人な人がいろんなことを書くよ

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ってのが、変数のコンパイラ最適化を防ぐ役目があるらしい。無くてもちゃんと動く場合があるかもしれないし、あってもダメな場合があるかもしれないけど、そんな難しいことわからん。