public static void CreateInstance(IntPtr hWindow, Size 設計画面サイズ, Size 物理画面サイズ) { if (null != Instance) { throw new Exception("インスタンスはすでに生成済みです。"); } Instance = new DXResources(設計画面サイズ, 物理画面サイズ, hWindow, hWindow); }
/// <summary> /// 進行描画ループを実行するタスクを生成し、開始する。 /// </summary> public void 開始する(AppFormBase form, Size 物理画面サイズ, Size 設計画面サイズ, IntPtr hWindow) { this.AppForm = form; // 進行描画タスクを生成する。 this._タスク = Task.Run(() => { // MTAThread try { #region " 初期化 " //---------------- Thread.CurrentThread.Name = "進行描画"; Debug.Assert(Thread.CurrentThread.GetApartmentState() == ApartmentState.MTA, "MTAThread で実行してください。"); DXResources.CreateInstance(hWindow, 物理画面サイズ, 設計画面サイズ); this.On開始(); this._Tick通知 = new AutoResetEvent(false); this._タイマ = new QueueTimer(1, 1, () => this._Tick通知.Set()); // 1ms ごとに Tick通知を set する 通知 終了通知 = null; //---------------- #endregion #region " メインループ " //---------------- var 表示タスク = new 表示タスク(); while (this._Tick通知.WaitOne()) // Tick 通知が来るまで待機。 { // (1) メッセージがあれば全部処理する。 bool メインループを抜ける = false; while (this.メッセージキュー.TryDequeue(out 通知 msg)) { if (msg is 終了通知) { 終了通知 = msg; メインループを抜ける = true; break; } else { this.メッセージを処理する(msg); } } if (メインループを抜ける) { break; } // (2) 進行する。 DXResources.Instance.アニメーション.進行する(); this.On進行(); // (3) 描画する。 if (表示タスク.表示待機中) { // 表示タスクがすでに起動されていて表示待ち状態になっているなら、今回は描画しない。 } else { this.On描画(); 表示タスク.表示を開始する(); } } //---------------- #endregion #region " 終了 " //---------------- this._タイマ?.Dispose(); this.On終了(); DXResources.ReleaseInstance(); this.AppForm = null; 終了通知?.完了通知.Set(); //---------------- #endregion } catch (Exception e) { form.例外を通知する(e); } }); }
public static void ReleaseInstance() { Instance?.Dispose(); Instance = null; }