---
# System prepended metadata

title: Thread

---

# Thread 
常に Thread の生成と破棄が繰り返されているのが気になる
必要であれば Thread.Pool を使う
本当に必要？

# TIntefacedObject を無くす
 メモリ管理をプログラマが行う

# CommManager
サーバとの通信を統括する
**1スレッド**
Queue による仕組み
コマンドとその返値を処理するハンドラを渡す
```delphi
  TCommManager.Send(
    Command, 
    procedure(const ARevceived: String)
    begin 
      {処理} 
    end);
```

# DialogManager
Dialog を一元管理する
Dialog Queue を作る
Dailog に種類を作り Queue 内で優先順位を作る

### 優先度
* Emergency 緊急。何よりも急いで出す
* Primary   優先順位高
* Normal    通常の順位

### 属性
* OnlyOne   Queue 内には１つしか存在できない（エラーなど）
* Toast     トースト表示する

# Redux
  Redux の仕組みは Delphi に合っている？

# View の仕組み
　複雑になりすぎているような…

# 積極的なコンポーネント化
　カプセル化を徹底し、単体テストをやりやすくする

# ContextMenu
　ChatMessage 毎に作っているみたいに見える
 
# 戻り値について
  TByteBufUtils.ToStream などで見られる方法で、戻り値としてインスタンスを返す方法が採用されている。
  例えば↓のような。
 
```delphi
function Foo: TStream;
begin
  Result := TBytesStream.Create;
end;
```

これだと、メモリ解放の責任を呼び出し側に求めることになるが、ToStream からインスタンスが返ってくるかどうかは ToStream を読まないと判らない。

なので、呼び出し側でインスタンスを作って、そのインスタンスを渡す様にする方が一般的かと。

```delphi
var Stream := TBytesStream.Create;
try
  TByteBufUtils.ToStream(Stream);
finally
  Stream.Free;
end;
```

もしくは、Delphi の命名規則に則って CreateXXX を使うと Delphi プログラマーは、これが生成したインスタンスを返すと判断できる。

```delphi
  var Foo := TBytesBufUtils.CreateStream; // ToStream を改名
  try
    // なにか処理
  finally
    Foo.Free;
  end;
```

