2011-02-08 5 views
2

나는의 라인을 따라 뭔가를 ..생성자의 스레드 ... 나쁜 습관?

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); 
    } 

스레드가의 WinForm 완전히 종료하기 전에 초기화되어 있는지 확인하는 데 사용됩니다. 이것은 나에게 나쁜 습관처럼 보입니다 ... 어떻게 그러한 기능을 더 잘 구현할 수 있습니까?

답변

1

STK 응용 프로그램이 양식 외부로 실행되는지 여부를 확인하고 응용 프로그램이 실행중인 경우에만 양식을 초기화하는 논리를 추출합니다.

그러나 양식이 닫히기 전에 완전히 초기화되도록하려면 양식의 닫기 이벤트를 무시하거나 STK 응용 프로그램이 실행되고 있지 않으면 닫는 작업을 취소하십시오.

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

@WulfgarPro : 기꺼이 도와! Will은 제가 아래에 제안한 것을 보여줍니다. – bitxwise

0

왜 폼에서 OnLoad 메서드를 재정의 한 다음 확인합니까?

+0

양식을 닫을 때까지 양식을로드 할 준비가되었는지 확인하려고합니다. OnLoad 메서드를 재정의하면 폼이 OnLoad 이벤트 전에 닫히는 경우에는 도움이되지 않습니다. – bitxwise

+1

폼을로드하기 전에 닫을 수 있다고 생각하지 않습니다. @Richard Schneider의 +1은 –

+0

입니다. Form은 Form_Load에서 DoEvents()로 잠수를하지 않는 한 완전히로드 될 때까지 메시지 대기열을 처리하지 않습니다. 사용자의 "닫기"메시지/동작은 Windows에서 메시지 대기열에 넣은 SendMessage 형태로 제공되며 양식이 완전히로드 될 때까지 GUI 스레드 (응용 프로그램의 모든 부분)에서 처리되지 않습니다. 예 : –

2

응용 프로그램에 대해 고유 한 Main 메서드를 구현해야합니다. 프로젝트 설정 내에서 양식을 시작하는 대신이 방법을 사용하도록 응용 프로그램에 지시하십시오.

이 Main 메서드 내에서 외부 응용 프로그램이 실행 중인지 확인하고 실행중인 경우 Form을 실행합니다.

예 :

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

관련 문제