// メインループを登録し、実行を開始する。
SharpDX.Windows.RenderLoop.Run( this, () => {
- this.inWork = true;
switch( this._AppStatus )
{
case AppStatus.開始:
case AppStatus.実行中:
lock( this._進行描画間同期 )
{
- this._描画処理を行う();
+ // 先の lock 中に進行タスクから Close() が BeginInvoke(非同期実行)されると、Close() が実行される前にここにくることになるのでそれをはじく。
+ if( this._AppStatus == AppStatus.実行中 )
+ {
+ this._描画処理を行う();
+ }
}
break;
break;
}
- this.inWork = false;
} );
}
- private bool inWork = false;
#region " IStrokeStyleT の実装 "
{
this._進行Status.現在の状態 = TriStateEvent.状態種別.OFF;
this._AppStatus = AppStatus.終了;
- this.Close();
+
+ // _AppStatus を変更したあとに、GUI スレッドで非同期実行を指示する。
+ this.BeginInvoke( new Action( () => { this.Close(); } ) );
}
}
}
}
}
- public override void 描画する( デバイスリソース dr )
+ public override void 進行する()
{
- Debug.Assert( this.活性化している );
- Debug.Assert( null != dr );
-
switch( this.現在のフェーズ )
{
case フェーズ.表示:
- this._背景画像.描画する( dr, 0.0f, 0.0f );
App.入力管理.すべての入力デバイスをポーリングする();
{
Log.Info( $"{Utilities.現在のメソッド名}: キャンセルされました。" );
this.現在のフェーズ = フェーズ.キャンセル;
- break;
}
// シンバル → 確定
if( App.入力管理.シンバルが入力された() )
{
Log.Info( $"{Utilities.現在のメソッド名}: 確定されました。" );
this.現在のフェーズ = フェーズ.確定;
- break;
}
break;
}
}
+ 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;
}