private void _タスクエントリ(Size 物理画面サイズ, Size 設計画面サイズ, IntPtr hWindow) { #region " 初期化 " //---------------- Thread.CurrentThread.Name = "進行描画"; Debug.Assert(Thread.CurrentThread.GetApartmentState() == ApartmentState.MTA, "MTAThread で実行してください。"); グラフィックデバイス.インスタンスを生成する(hWindow, 物理画面サイズ, 設計画面サイズ); this._Tick通知 = new AutoResetEvent(false); this._終了指示通知 = new ManualResetEventSlim(false); this._終了完了通知 = new ManualResetEventSlim(false); this.On開始する(); // 派生クラスでの開始処理 this._タイマ = new QueueTimer(1, 1, () => this._Tick通知.Set()); //---------------- #endregion #region " メインループ " //---------------- var 表示タスク = new 表示タスク(); while (this._Tick通知.WaitOne()) // Tick 通知が来るまで待機。 { // メッセージがあれば全部処理する。 bool ループを抜ける = false; while (this._メッセージキュー.TryDequeue(out 通知メッセージ msg)) { if (msg is 終了メッセージ) { // メインループを抜ける。 msg.完了通知.Set(); ループを抜ける = true; break; } else { this.メッセージを処理する(msg); } } if (ループを抜ける) { break; } // 進行する。 グラフィックデバイス.Instance.アニメーション.進行する(); this.進行する(); // 描画する。 if (false == 表示タスク.ただいま表示中) // 描画は、表示中ではないときに限る。 { this.描画する(); // 垂直帰線を待ってスワップチェーンを表示するタスクを開始する。 表示タスク.表示開始(); } } //---------------- #endregion #region " 終了 " //---------------- this._タイマ?.Dispose(); // 進行用タイマを停止する。 this.On終了する(); // 派生クラスの終了。 グラフィックデバイス.インスタンスを解放する(); this.AppForm = null; this._終了完了通知.Set(); //---------------- #endregion }