『増補改訂版 Java言語で学ぶデザインパターン入門 マルチスレッド編』にある
「Thread-Per-Messageパターン」をC++ Builder 2009で実装してみました。
プログラムの意味は『増補改訂版 Java言語で学ぶデザインパターン入門 マルチスレッド編』をご覧下さい。
『増補改訂版 Java言語で学ぶデザインパターン入門 マルチスレッド編』では無名インナークラスを使用していますが、
C++Builder2009では同じことができませんので、THandleThreadクラスを作成しました。
//スレッドセーフな出力
std::unique_ptr<TCriticalSection> CriticalSection(new TCriticalSection);
void Print(const std::string& S)
{
CriticalSection->Acquire();
std::cout << S << std::endl;
CriticalSection->Release();
}
//THelperクラス
class THelper
{
public:
void Handle(int Count, std::string C)
{
boost::format fmt(" handle(%d, %s) %s");
Print((fmt % Count % C % "BEGIN").str());
for (int i = 0; i < Count; i++)
{
Slowly();
Print(C);
}
Print((fmt % Count % C % "END").str());
};
private:
void Slowly()
{
Sleep(100);
};
};
//THandleThreadクラス
class THandleThread : public TThread
{
public:
__fastcall THandleThread(THelper* Helper, int Count, std::string C)
: TThread(false), FHelper(Helper), FCount(Count), FC(C) {};
protected:
void __fastcall Execute()
{
FHelper->Handle(FCount, FC);
};
private:
THelper* FHelper;
int FCount;
std::string FC;
};
//THostクラス
class THost
{
public:
THost() : FHelper(new THelper()) {};
void Request(int Count, std::string C)
{
boost::format fmt(" request(%d, %s) %s");
Print((fmt % Count % C % "BEGIN").str());
new THandleThread(FHelper.get(), Count, C);
Print((fmt % Count % C % "END").str());
};
private:
std::unique_ptr<THelper> FHelper;
};
int _tmain(int argc, _TCHAR* argv[])
{
Print("main BEGIN");
THost host;
host.Request(10, "A");
host.Request(20, "B");
host.Request(30, "C");
Print("main END");
Sleep(INFINITE);
return 0;
}