Exemple #1
0
        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
        }