2011-04-27 2 views
0

콘솔 응용 프로그램의 중간에 양식을 표시하여 특정 상태 정보를 표시하고 특정 이벤트가 발생할 때 자동으로 양식을 닫으 려합니다 . 다음 코드 부분만으로도 충분합니까?콘솔 응용 프로그램에서 특정 시점 (실행 도중)에 양식 표시

표시

ModuleInitializerForm moduleInitializerDlg = new ModuleInitializerForm() 
{ 
    Parent = parent, 
    TopMost = true, 
    TopLevel = true, 
    Text = Common.MESSAGE_INFO_TITLE, 
    ControlBox = false, 
    FormBorderStyle = FormBorderStyle.FixedDialog, 
    KeyPreview = false, 
}; 

moduleInitializerDlg.Initialize(); 
moduleInitializerDlg.ShowDialog(); 

닫기 양식 형태는 ShowDialog를(),이 사용자까지 차단됩니다 이루어집니다 스레드를 사용하고 있기 때문에

public void OnModuleInitializationCompleted(object sender, EventArgs e) 
    { 
    if (this.InvokeRequired) 
    { 
     this.BeginInvoke(new ECEventsHandler(OnModuleInitializationCompleted), sender, e); 
    } 
    else 
    { 
     this.Close(); 
    } 
    } 
+2

양식을 자체 스레드에서 실행하고 있습니까? –

+0

나는 그 질문을 이해하지 못한다. 내가 놓친 게 있니? – Maanu

+0

@Maanu : (확장 Lasse 주석) ShowDialog를 사용하는 문제는 폼이 닫힐 때까지 스레드의 실행이 차단된다는 것입니다. 따라서 하나의 쓰레드 만 가지고 있다면 그 쓰레드는 동일한 쓰레드에서 트리거 된 이벤트에 의해 닫히지 않을 것입니다 ... – digEmAll

답변

2

(또는 너) 양식을 닫는다.

대신 Show()를 사용하면 스레드가 계속 진행됩니다. 그러나 해당 스레드에 Windows 메시지를 펌핑하는 사람이 없다면 양식은 "죽었습니다", 즉 아무 것도 응답하지 않습니다. 일반적인 콘솔 앱 프로젝트로 시작한다면, 이것이 사실 일 것이다. ShowDialog()를 사용하면 로컬 메시지 루프가 만들어져 창에서 응답합니다.

폼을 표시하는 Windows Forms UI에 별도의 스레드가 있어야합니다. ShowDialog() 대신 Application.Run(moduleInitializerDlg);을 사용할 것입니다. 왜냐하면 내가 말할 수있는 한 메시지 펌핑 아키텍처를 더 잘 설정하기 때문입니다. 이 호출은 ShowDialog()와 같은 방식으로 스레드를 차단합니다.

+0

'Application.Run()'을 호출하기 전에 작업 스레드를 시작할 수 있지만 아직 양식이 표시되지 않은 경우 처리기가 여전히 작동하는지 확인하십시오. – Jodrell

0

클릭시 열어야하는 양식의 속성으로 이동하십시오 ... 레이아웃 섹션으로 이동하여 시작 위치를 Centerscreen에 놓거나 매번 도킹하려는 부모가있는 경우 CenterParent를 사용하십시오. ..

즐기십시오!

관련 문제