2012-03-06 2 views
2

이 Windows 양식은 timer1이고 사용 간격은 2000ms입니다. 양식이 2 초마다 메시지 상자를 표시하는 이유는 무엇입니까? UI 스레드라고하는 처음 타이머 틱이 OK 버튼을 누를 때까지 기다릴 것이므로 버튼을 누르지 않으면 다른 메시지 상자가 나타나지 않아야합니다. 하지만 나타납니다! 왜?Windows Form Timer 대 Single Thread 응용 프로그램

타이머가 자신의 스레드에서 작동한다는 것을 알고 타이머가 timer_tick 함수를 호출합니다. 질문은 mbox.show()에서 UI 스레드가 차단되었을 때 다른 메시지 상자가 어떻게 표시되는지입니다.

public partial class Form1 : Form 
    { 
    public Form1() 
    { 
     InitializeComponent(); 
    } 

    private void timer1_Tick(object sender, EventArgs e) 
    { 
     MessageBox.Show("test"); 
    } 
    } 

답변

3

이입니다. 메시지 루프를 보내주는 모달 대화 상자입니다. 따라서 모든 일반 Windows 알림은 여전히 ​​제공됩니다. 페인트 이벤트처럼. 유일한 차단은 사용자 입력 알림, 마우스 및 키보드입니다. 그러나 은 아니요 타이머 메시지입니다. Form.ShowDialog() 메서드는이 방법으로도 작동합니다.

직접 타이머를 비활성화해야합니다.

+2

+1. –

2

타이머는 기본 UI 스레드와 마찬가지로 확인 버튼을 기다리지 않는 자체 작업자 스레드를 만듭니다.

다음을 시도해보십시오. 작동합니까?

private void timer1_Tick(object sender, EventArgs e)  
{  
    timer.Stop(); 
    MessageBox.Show("test");  
    timer.Start(); 
} 

EDIT (지금 유감을 확인할 수 없습니다) : 메인 UI 스레드가 mbox.Show에서 중지 그렇다면 의견

의 질문에 응답
() 왜 다른 메시지 박스 표시?

this SO post

MessageBox.Show이가 호출 된 스레드에서 UI를 보여집니다. 이 스레드에서 실행중인 메시지 펌프가 아닌 경우 기능을 수행하기 위해 임시로 을 설정합니다. 표시 호출이 메시지 상자 대화에 의해 차단되지 않도록 타이머가되지 UI 스레드에 자신의 스레드에서 작동

+0

메인 UI 스레드가 mbox.Show()에서 중지 된 경우 다른 메시지 상자가 표시되는 이유는 무엇입니까? – HPT

+0

업데이트보기 (편집 부분) – sll

0

을 완료 한 후에는 그것을 해체됩니다.

리플렉터를 사용하여 작동 원리를 볼 수 있습니다.

+0

타이머가 자신의 스레드에서 작동하고 타이머가 timer_tick 함수를 호출한다는 것을 알고 있습니다. 문제는 mbox.show()에서 UI 스레드가 차단되었을 때 다른 메시지 상자가 어떻게 표시되는지입니다. 좋은 설명을 위해서 – HPT

0

당신은 메시지 상자가 표시 될 때 타이머를 중지하고 상자를 닫을 때를 다시 시작해야합니다 : 당신이 메시지 박스를 사용하기 때문에

private void timer1_Tick(object sender, EventArgs e) 
{ 
    this.timer.Stop(); 
    DialogResult result = MessageBox.Show("test"); 
    if (result == DialogResult.OK) 
    { 
     this.timer.Start(); 
    } 
} 
관련 문제