2011-04-11 2 views
5

계속 진행하기 전에 버튼을 누르기를 기다리는 프로그램을 만들고 싶습니다. while 루프를 만들고 버튼을 클릭 할 때까지 루프를 만들었습니다. 그리고 bool을 true로 설정합니다. 끝으로 while 루프의 경우,이는 한 프로그램이 false로 "Redpress"를 설정하기 전에 버튼을 눌러 기다립니다으로,C# 프로그램이 눌려지기를 기다리는 프로그램 만들기

while (!Redpress) 
        { 
         //I'd like the wait here 
        } 
        Redpress = false; 

동안이 있는지 여부는 중요하지 않습니다 충돌했다 .. 어떤 아이디어?

+0

버튼 이벤트가 이미 있습니다. 이벤트를 기다리는 프로그램이 필요합니다. – Zizo47

+0

사용자 인터페이스 스레드에서 이와 같은 코드를 작성할 수 없습니다. UI가 고정됩니다. UI 프로그래밍의 이벤트 중심 특성을 이해하는 것이 중요합니다. –

답변

6

이벤트를 사용하십시오 - 그것이 무엇을 위해 설계되었습니다.

당신은 당신의 코드를 호출 Button_Click 이벤트 처리기에서 이것에 대한 부울 변수를 사용할 필요가 없습니다 : @trickdev 당신이 사용하는 경우이 이벤트에 가입 할 필요 하겠지만 지적 하듯이

private void Button_Click(object sender, EventArgs e) 
{ 
    // The code you need to execute when the button is pressed 
} 

Visual Studio의 이벤트 창에서 빈 처리기를 포함하여 필요한 코드를 추가합니다.

이벤트 구동 프로그램을 사용하면 다음 "일"이 발생할 때까지 항상 기다리고 있습니다. 따라서 귀하의 경우 (귀하의 응용 프로그램을 올바르게 이해했다면) 프로그램을 시작할 때 첫 번째 버튼에 "N"번만 알려야합니다. 이벤트로 작성하면 코드가 완료되면 응용 프로그램은 대기 상태로 돌아갑니다.

그런 다음 버튼 클릭 이벤트 핸들러에서 모든 버튼을 동일한 이벤트에 등록 할 수 있습니다. 올바른 버튼이 눌러 졌는지 확인하고 다음 버튼이 깜박이도록 할 수 있습니다. 잘못된 버튼을 누르면 적합한 메시지가 표시됩니다.

그래서 의사 코드에서, 당신은 : 당신은 당신이 원하는 어떤 논리를 넣을 수 있습니다

myButton.Click += myButton_EventHandler; 

:

public class Form 
{ 
    Initialise() 
    { 
     this.Loaded += FormLoaded; 
    } 

    private void FormLoaded(object sender, EventArgs e) 
    { 
     // pick a button 
     pickedButton.Flash(); 
    } 

    private void Button_Click(object sender, EventArgs e) 
    { 
     if (sender == pickedButton) 
     { 
      pickedButton = pickButton(); 
     } 
     else 
     { 
      message = "Sorry wrong button, try again"; 
     } 

     pickedButton.Flash(); 
    } 
} 

public class Button 
{ 
    public void Flash() 
    { 
     // loop N times turning button on/off 
    } 
} 
+0

그건 이해가 안 돼요. redpress는 버튼이 클릭되었는지 여부를 정의하는 부울입니다. 버튼을 눌렀을 때 bool을 true로 설정하는 이벤트가 이미 있습니다. 프로그램이 이벤트를 기다릴 수 있도록 코드가 필요합니다 ... – Zizo47

+0

@ Zizo47 - 미안 해요. 오해했습니다. - 설명에 표시된 처리기에 필요한 코드를 넣으십시오. – ChrisF

+0

이것은 여전히 ​​변경되지 않습니다, 나는 프로그램을 멈추고 버튼을 클릭하기를 기다려야합니다. 버튼 자체에는 문제가 없습니다. – Zizo47

3

윈도우 컨트롤이 폼 생성자에서 구독 할 수 있습니다 Click 이벤트를 양식 핸들러에서 발생하고 버튼을 클릭하면 실행됩니다.

private void myButton_EventHandler(object sender, EventArgs e) 
{ 
    Redpress = false; 
} 

인터페이스를 잠글 것이므로 양식 응용 프로그램의 주 스레드를 차단 (어떤 방법 으로든 잠자는 회전 등)하지 않도록해야합니다. 타이머, 스레드, 대리인 및 BackgroundWorkers를 포함하여이를 방지하는 데는 여러 가지 방법이 있습니다.

편집 : 당신의 갱신이 당신이 ManualResetEvent을 사용할 수에 대한

을 포함합니다.

private readonly ManualResetEvent mre = new ManualResetEvent(false); 

private void myButton_EventHandler(object sender, EventArgs e) 
{ 
    mre.Set(); 
} 

양식 코드를 호출하여 기다릴 수 : 이벤트가 해고 될 때까지

mre.WaitOne(); 

이것은 실행 코드 대기 할 것입니다. 희망이 도움이됩니다.

참고 : 특별한 경우가 아니라면 오해하지 마십시오 (이 시간에 내 머리 꼭대기에서 머리카락을 생각할 수는 없습니다!). 코드에 직접 입력해야합니다 이벤트가 발생할 때까지 스레드를 차단하는 대신 처리기를 사용하십시오.

+0

당신이 한 모든 일은 이벤트와 함께 redpress로 설정되어 있습니다. "그"이벤트를 기다리는 프로그램이 필요합니다 ... – Zizo47

+0

그 트릭을해야합니다. – trickdev

0

해당 이벤트를 기다리는 프로그램이 필요하면 메인 액세스/페이지로드에 waitForTheButton 코드를 쓰지 마십시오.

코드 대신 이벤트를 입력하십시오. 그래서 당신은 적극적으로 기다릴 필요가 없습니다. 이벤트가 그 것이다.

예 :

static void Main 
{ 
    myButton.OnClick += myButton_EventHandler; 
} 

private void myButton_EventHandler(object sender, EventArgs e) 
{ 
    DoThis(); 
    DoThat(); 
}          

것은 당신이 정말로 당신이 심지어 절차 패러다임에서 작업 할 경우이

static void Main() 
{ 
    while (notPressed) { } 
    DoThis(); 
    DoThat(); 
} 

같은이있는 경우 그럼 당신은 그것을 변경 될 수 있습니다 OOP 언어를 사용하는 경우 세마포어 또는 이와 비슷한 것을 사용해야합니다. 하지만 실제로는 당신이 인 것 같지 않습니다. 이이 되길 바랍니다.

관련 문제