2011-02-08 21 views
2

私は、スレッドがWinフォームが完全に終了を試みる前に初期化されていることを確認するために使用されるコンストラクタのスレッド...悪い練習ですか?

private UavControlForm() 
    { 
     InitializeComponent(); 

     if (ControlFacade.CheckIfStkIsLaunched()) 
     { 
      _controlFacade = new ControlFacade(); 
      SubscribeToStkQuit(); 
     } 
     else 
     { 
      Thread tExitUavController = new Thread(ExitUavController); 
      tExitUavController.IsBackground = true; 
      tExitUavController.Start(); 
     }    
    } 

    private void ExitUavController() 
    { 
     Thread.Sleep(500); 
     ForceCloseAtBeginning(); 
     Application.Exit(); 
    } 

    private void ForceCloseAtBeginning() 
    { 
     DialogResult dlgResult = 
      MessageBox.Show("STK application not running. UavController will now close.", "Closing...", 
      MessageBoxButtons.OK, MessageBoxIcon.Warning); 
    } 

...の線に沿って何かを持っています。これは私にとって悪い習慣のように思えます...どうすればそのような機能をよりうまく実装できますか?

答えて

1

Iは、STKアプリケーションはフォームの外に実行されているかどうかをチェックするロジックを抽出し、アプリケーションのみが実行されている場合、フォームを初期化することになります。

しかし、あなたはSTKアプリケーションが実行されていない場合、その上にフォームのクロージングイベントやフックをオーバーライドし、閉鎖を解除のいずれか、その後、それが閉じる前に、フォームが完全に初期化されていることを確認するためにしようとしている場合。

protected override void OnClosing(CancelEventArgs e) { 
    if (!ControlFacade.CheckIfStkIsLaunched()) { 
     e.Cancel = true; 
    } 
    base.OnClosing(e); 
} 
+0

@WulfgarPro:助けるために喜んで!私が以下に示唆しているものの例を提供します。 – bitxwise

0

なぜフォーム上のOnLoadメソッドをオーバーライドしてからチェックを行うのはなぜですか?

+0

私は、フォームを閉じる前にフォームをロードする準備ができていることを確認したいと思うと思います。 OnLoadメソッドをオーバーライドすると、OnLoadイベントの前にフォームが閉じられると、彼の助けになりません。 – bitxwise

+1

フォームがロードされる前に閉じられるとは思わない。 @Richard Schneiderの+1 –

+0

+1それが完全に読み込まれるまで(あなたがのForm_LoadからDoEvents関数にsuecideダイビングを()を取る場合を除き)フォームは、メッセージキューを処理しません。ユーザからの「クローズ」のメッセージ/アクションは、Windowsでメッセージキューに入れるのSendMessageの形で来ると、フォームが完全にロードされるまで(アプリケーションのどの部分でも)GUIスレッドによって処理されることはありません。例の場合は –

2

あなたはあなたのアプリケーション用に独自のMainメソッドを実装する必要があります。プロジェクト設定内で、フォームを開始するのではなく、このメソッドを使用するようにアプリケーションに指示します。このMainメソッド内

は、あなたが外部のアプリケーションが実行されているかどうかのチェックを実行することになり、もしそうであれば - [フォームを実行します。

例:

static void Main() 
{ 
    if (!ControlFacade.CheckIfStkIsLaunched()) 
    { 

     DialogResult dlgResult = 
      MessageBox.Show("STK application not running. UavController will now close.", "Closing...", 
      MessageBoxButtons.OK, MessageBoxIcon.Warning); 

     Application.Exit(); 
     return; 
    } 

    Application.Run(new UavControlForm()); 
} 
+0

+1 – bitxwise

関連する問題