다음을 통해 공유


연습: 이벤트 처리(Visual Basic)

이벤트 작업 방법을 보여 주는 두 가지 항목 중 두 번째 항목입니다. 첫 번째 항목인 자습서: 이벤트 선언 및 발생은 이벤트를 선언하고 발생시키는 방법을 보여 줍니다. 이 섹션에서는 해당 연습에서의 양식과 클래스를 사용하여 이벤트가 발생했을 때 이를 처리하는 방법을 보여줍니다.

클래스 예제에서는 Widget 기존 이벤트 처리 문을 사용합니다. Visual Basic은 이벤트 작업을 위한 다른 기술을 제공합니다. 연습으로 이 예제를 수정하여 AddHandlerHandles 문을 사용할 수 있습니다.

위젯 클래스의 PercentDone 이벤트를 처리하려면

  1. 다음 코드를 다음 위치에 배치합니다.Form1

    Private WithEvents mWidget As Widget
    Private mblnCancel As Boolean
    

    키워드는 WithEvents 변수 mWidget 를 사용하여 개체의 이벤트를 처리하도록 지정합니다. 개체를 만들 클래스의 이름을 제공하여 개체 종류를 지정합니다.

    변수 mWidget는 클래스 수준이어야 하는 Form1 변수이므로 WithEvents에 선언됩니다. 이는 배치하는 클래스의 유형에 관계없이 마찬가지입니다.

    변수 mblnCancel 는 메서드를 취소 LongTask 하는 데 사용됩니다.

이벤트를 처리하는 코드 작성

변수를 사용하여 WithEvents선언하는 즉시 변수 이름이 클래스 코드 편집기의 왼쪽 드롭다운 목록에 나타납니다. 선택하면 mWidgetWidget 클래스의 이벤트가 오른쪽 드롭다운 목록에 표시됩니다. 이벤트를 선택하면 접두 mWidget 사 및 밑줄이 있는 해당 이벤트 프로시저가 표시됩니다. 변수와 WithEvents 연결된 모든 이벤트 프로시저에는 변수 이름이 접두사로 지정됩니다.

이벤트를 처리하려면

  1. mWidget에서 왼쪽 드롭다운 목록에서 선택합니다.

  2. PercentDone 오른쪽 드롭다운 목록에서 이벤트를 선택합니다. 코드 편집기에서 이벤트 프로시저를 mWidget_PercentDone 엽니다.

    비고

    코드 편집기는 새 이벤트 처리기를 삽입하는 데 유용하지만 필수는 아닙니다. 이 연습에서는 이벤트 처리기를 코드에 바로 복사하는 것이 더 간편합니다.

  3. 이벤트 처리기에 다음 코드를 mWidget_PercentDone 추가합니다.

    Private Sub mWidget_PercentDone(
        ByVal Percent As Single,
        ByRef Cancel As Boolean
    ) Handles mWidget.PercentDone
        lblPercentDone.Text = CInt(100 * Percent) & "%"
        My.Application.DoEvents()
        If mblnCancel Then Cancel = True
    End Sub
    

    이벤트가 발생할 때마다 PercentDone 이벤트 프로시저는 컨트롤에 완료 백분율을 Label 표시합니다. 이 DoEvents 메서드를 사용하면 레이블을 다시 칠할 수 있으며 사용자에게 취소 단추를 클릭할 수도 있습니다.

  4. 이벤트 처리기에 대해 Button2_Click 다음 코드를 추가합니다.

    Private Sub Button2_Click(
        ByVal sender As Object,
        ByVal e As System.EventArgs
    ) Handles Button2.Click
        mblnCancel = True
    End Sub
    

실행 중인 동안 사용자가 LongTask 버튼을 클릭하면, Button2_Click 문장이 이벤트 처리를 허용하자마자 DoEvents 이벤트가 실행됩니다. 클래스 수준 변수 mblnCancelTrue으로 설정되고, mWidget_PercentDone 이벤트가 이를 테스트한 후 인수 ByRef CancelTrue로 설정합니다.

WithEvents 변수를 개체에 연결

Form1는 이제 Widget 개체의 이벤트를 처리하도록 설정되었습니다. 해야 할 일은 어딘가에서 Widget를 찾는 것입니다.

디자인 타임에 변수 WithEvents 를 선언하면 연결된 개체가 없습니다. WithEvents 변수는 다른 개체 변수와 같습니다. 개체를 만들고 변수를 사용하여 개체에 대한 참조를 할당해야 합니다 WithEvents .

개체를 만들고 개체에 대한 참조를 할당하려면

  1. 코드 편집기에서 왼쪽 드롭다운 목록에서 (Form1 이벤트)를 선택합니다.

  2. Load 오른쪽 드롭다운 목록에서 이벤트를 선택합니다. 코드 편집기에서 이벤트 프로시저를 Form1_Load 엽니다.

  3. 이벤트 프로시저에 Form1_Load 대해 다음 코드를 추가하여 다음을 만듭니다 Widget.

    Private Sub Form1_Load(
        ByVal sender As System.Object,
        ByVal e As System.EventArgs
    ) Handles MyBase.Load
        mWidget = New Widget
    End Sub
    

이 코드가 실행되면 Visual Basic은 개체를 Widget 만들고 해당 이벤트를 연결된 mWidget이벤트 프로시저에 연결합니다. 이 시점부터 Widget 이벤트가 PercentDone 이벤트를 발생시키면 mWidget_PercentDone 이벤트 프로시저가 실행됩니다.

LongTask 메서드를 호출하려면

  • 이벤트 처리기에 다음 코드를 Button1_Click 추가합니다.

    Private Sub Button1_Click(
        ByVal sender As Object,
        ByVal e As System.EventArgs
    ) Handles Button1.Click
        mblnCancel = False
        lblPercentDone.Text = "0%"
        lblPercentDone.Refresh()
        mWidget.LongTask(12.2, 0.33)
        If Not mblnCancel Then lblPercentDone.Text = CStr(100) & "%"
    End Sub
    

메서드를 LongTask 호출하기 전에 완료 비율을 표시하는 레이블을 초기화해야 하며 메서드를 취소하기 위한 클래스 수준 Boolean 플래그를 로 False설정해야 합니다.

LongTask 는 12.2초의 작업 기간으로 호출됩니다. 이 PercentDone 이벤트는 1/3초마다 한 번씩 발생합니다. 이벤트가 발생할 때마다 mWidget_PercentDone 이벤트 절차가 실행됩니다.

LongTask이 완료되면, mblnCancel를 테스트하여 LongTask가 정상적으로 종료되었는지, 또는 mblnCancelTrue로 설정되어 중지되었는지 확인합니다. 완료 비율은 이전 사례에서만 업데이트됩니다.

프로그램을 실행하려면

  1. F5 키를 눌러 프로젝트를 실행 모드로 전환합니다.

  2. 작업 시작 단추를 클릭합니다. 이벤트가 발생할 때마다 PercentDone 레이블이 완료된 작업의 백분율로 업데이트됩니다.

  3. 취소 단추를 클릭하여 작업을 중지합니다. 취소 단추의 모양은 클릭할 때 즉시 변경되지 않습니다. Click 이벤트는 My.Application.DoEvents 문이 이벤트 처리를 허용할 때까지 발생할 수 없습니다.

    비고

    메서드는 My.Application.DoEvents 폼과 정확히 동일한 방식으로 이벤트를 처리하지 않습니다. 예를 들어 이 설명에서는 취소 단추를 두 번 클릭해야 합니다. 폼에서 이벤트를 직접 처리할 수 있도록 멀티쓰레딩을 사용할 수 있습니다. 자세한 내용은 관리되는 스레딩을 참조하세요.

F11을 사용하여 프로그램을 실행하고 코드를 한 번에 한 줄씩 실행하는 것이 유용할 수 있습니다. 실행이 LongTask에 어떻게 진입하는지 명확하게 볼 수 있으며, Form1 이벤트가 발생할 때마다 PercentDone에 잠시 다시 진입합니다.

실행이 다시 코드 Form1LongTask 에 있는 동안 메서드가 다시 호출되면 어떻게 되나요? 최악의 경우, 이벤트가 발생할 때마다 LongTask가 호출되면 스택 오버플로가 발생할 수 있습니다.

변수 mWidget에 새 Widget 개체에 대한 참조를 Widget에 할당하여 다른 mWidget 개체의 이벤트를 처리하도록 할 수 있습니다. 사실상 Button1_Click의 코드는 버튼을 클릭할 때마다 이 작업을 수행하도록 만들 수 있습니다.

다른 위젯에 대한 이벤트를 처리하려면

  • 다음 코드 줄을 Button1_Click 프로시저에 추가하여 mWidget.LongTask(12.2, 0.33) 줄 바로 앞에 옵니다.

    mWidget = New Widget
    ' Create a new Widget object.
    

위의 코드는 단추를 클릭할 때마다 새 Widget 코드를 만듭니다. 메서드 LongTask가 완료되는 즉시 Widget에 대한 참조가 해제되고, Widget가 파괴됩니다.

변수는 WithEvents 한 번에 하나의 개체 참조만 포함할 수 있으므로 다른 Widget 개체를 할당하면 mWidget이전 Widget 개체의 이벤트가 더 이상 처리되지 않습니다. 이전 mWidget개체에 대한 참조를 포함하는 유일한 개체 변수인 경우 Widget 개체가 제거됩니다. 여러 Widget 개체의 이벤트를 처리하려면 문을 사용하여 AddHandler 각 개체의 이벤트를 개별적으로 처리합니다.

비고

필요한 만큼 WithEvents 변수를 선언할 수 있지만 변수 배열 WithEvents 은 지원되지 않습니다.

참고하십시오

  • 가이드: 이벤트 선언 및 발생
  • 이벤트