OSDN Git Service

進行タスクからアプリを終了すると例外が発生するミスを修正。
authorくまかみ工房 <kumakamikoubou@gmail.com>
Wed, 10 May 2017 08:20:18 +0000 (17:20 +0900)
committerくまかみ工房 <kumakamikoubou@gmail.com>
Wed, 10 May 2017 08:20:18 +0000 (17:20 +0900)
タイトルステージの描画処理から進行処理を分離。

StrokeStyleT/App.cs
StrokeStyleT/ステージ/タイトル/タイトルステージ.cs

index 8f71a36..717387f 100644 (file)
@@ -293,7 +293,6 @@ namespace SST
                        // メインループを登録し、実行を開始する。
                        SharpDX.Windows.RenderLoop.Run( this, () => {
 
-                               this.inWork = true;
                                switch( this._AppStatus )
                                {
                                        case AppStatus.開始:
@@ -305,7 +304,11 @@ namespace SST
                                        case AppStatus.実行中:
                                                lock( this._進行描画間同期 )
                                                {
-                                                       this._描画処理を行う();
+                                                       // 先の lock 中に進行タスクから Close() が BeginInvoke(非同期実行)されると、Close() が実行される前にここにくることになるのでそれをはじく。
+                                                       if( this._AppStatus == AppStatus.実行中 )
+                                                       {
+                                                               this._描画処理を行う();
+                                                       }
                                                }
                                                break;
 
@@ -314,10 +317,8 @@ namespace SST
                                                break;
                                }
 
-                               this.inWork = false;
                        } );
                }
-               private bool inWork = false;
 
 
                #region " IStrokeStyleT の実装 "
@@ -837,7 +838,9 @@ namespace SST
                                {
                                        this._進行Status.現在の状態 = TriStateEvent.状態種別.OFF;
                                        this._AppStatus = AppStatus.終了;
-                                       this.Close();
+
+                                       // _AppStatus を変更したあとに、GUI スレッドで非同期実行を指示する。
+                                       this.BeginInvoke( new Action( () => { this.Close(); } ) );
                                }
                        }
                }
index 22aad26..fbcb5b3 100644 (file)
@@ -45,15 +45,11 @@ namespace SST.ステージ.タイトル
                        }
                }
 
-               public override void 描画する( デバイスリソース dr )
+               public override void 進行する()
                {
-                       Debug.Assert( this.活性化している );
-                       Debug.Assert( null != dr );
-
                        switch( this.現在のフェーズ )
                        {
                                case フェーズ.表示:
-                                       this._背景画像.描画する( dr, 0.0f, 0.0f );
 
                                        App.入力管理.すべての入力デバイスをポーリングする();
 
@@ -62,14 +58,12 @@ namespace SST.ステージ.タイトル
                                        {
                                                Log.Info( $"{Utilities.現在のメソッド名}: キャンセルされました。" );
                                                this.現在のフェーズ = フェーズ.キャンセル;
-                                               break;
                                        }
                                        // シンバル → 確定
                                        if( App.入力管理.シンバルが入力された() )
                                        {
                                                Log.Info( $"{Utilities.現在のメソッド名}: 確定されました。" );
                                                this.現在のフェーズ = フェーズ.確定;
-                                               break;
                                        }
                                        break;
 
@@ -79,6 +73,23 @@ namespace SST.ステージ.タイトル
                        }
                }
 
+               public override void 描画する( デバイスリソース dr )
+               {
+                       Debug.Assert( this.活性化している );
+                       Debug.Assert( null != dr );
+
+                       switch( this.現在のフェーズ )
+                       {
+                               case フェーズ.表示:
+                                       this._背景画像.描画する( dr, 0.0f, 0.0f );
+                                       break;
+
+                               case フェーズ.確定:
+                               case フェーズ.キャンセル:
+                                       break;
+                       }
+               }
+
 
                private 画像 _背景画像 = null;
        }