Thread-Per-Messageパターン

増補改訂版 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;
}

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です