연습: 이벤트 선언 및 발생(Visual Basic)

이 연습에서는 Widget이라는 클래스에 대한 이벤트를 선언하고 발생시키는 방법을 보여 줍니다. 단계를 완료한 후에는 Widget 개체의 이벤트를 사용하여 애플리케이션에 상태 정보를 제공하는 방법을 보여 주는 동반 주제인 연습: 이벤트 처리를 읽어보는 것이 좋습니다.

위젯 클래스

잠시 동안 Widget 클래스가 있다고 가정합니다. Widget 클래스에는 실행하는 데 오랜 시간이 걸릴 수 있는 메서드가 있으며 애플리케이션에서 일종의 완료 표시기를 표시할 수 있기를 원합니다.

물론 Widget 개체가 완료율 대화 상자를 표시하도록 할 수 있지만 그렇게 하면 Widget 클래스를 사용한 모든 프로젝트에서 해당 대화 상자가 계속 표시됩니다. 개체 디자인의 좋은 원칙은 개체의 전체 목적이 양식이나 대화 상자를 관리하는 것이 아니라면 개체를 사용하는 애플리케이션이 사용자 인터페이스를 처리하도록 하는 것입니다.

Widget의 목적은 다른 작업을 수행하는 것이므로 PercentDone 이벤트를 추가하고 Widget의 메서드를 호출하는 프로시저가 해당 이벤트를 처리하고 상태 업데이트를 표시하도록 하는 것이 좋습니다. PercentDone 이벤트는 작업을 취소하는 메커니즘도 제공할 수 있습니다.

이 항목에 대한 코드 예제를 빌드하려면 다음을 수행합니다.

  1. 새 Visual Basic Windows 애플리케이션 프로젝트를 열고 이름이 Form1인 양식을 만듭니다.

  2. Form1에 두 개의 단추와 레이블을 추가합니다.

  3. 다음 표에 나와 있는 것처럼 개체의 이름을 지정합니다.

    Object 속성 설정
    Button1 Text 작업 시작
    Button2 Text 취소
    Label (Name), Text lblPercentDone, 0
  4. 프로젝트 메뉴에서 클래스 추가를 선택하여 Widget.vb라는 클래스를 프로젝트에 추가합니다.

위젯 클래스에 대한 이벤트를 선언하려면 다음을 수행합니다.

  • Event 키워드를 사용하여 Widget 클래스에서 이벤트를 선언합니다. WidgetPercentDone 이벤트에서 볼 수 있듯이 이벤트에는 ByValByRef 인수가 있을 수 있습니다.

    Public Event PercentDone(ByVal Percent As Single,
                             ByRef Cancel As Boolean)
    

호출 개체가 PercentDone 이벤트를 수신하면 Percent 인수에는 완료된 작업율이 포함됩니다. 이벤트를 발생시킨 메서드를 취소하려면 Cancel 인수를 True로 설정할 수 있습니다.

참고 항목

다음 예외를 제외하고 프로시저의 인수와 마찬가지로 이벤트 인수를 선언할 수 있습니다. 이벤트에는 Optional 또는 ParamArray 인수가 있을 수 없으며 이벤트에는 반환 값이 없습니다.

PercentDone 이벤트는 Widget 클래스의 LongTask 메서드에 의해 발생합니다. LongTask는 메서드가 작업 수행을 가장하는 시간 길이와 LongTaskPercentDone 이벤트를 발생시키기 위해 일시 중지하기 전의 최소 시간 간격이라는 두 가지 인수를 받습니다.

PercentDone 이벤트를 발생시키려면 다음을 수행합니다.

  1. 이 클래스에서 사용하는 Timer 속성에 대한 액세스를 단순화하려면 클래스 모듈의 선언 섹션 맨 위의 Class Widget 문 위에 Imports 문을 추가하세요.

    Imports Microsoft.VisualBasic.DateAndTime
    
  2. 다음 코드를 Widget 클래스에 추가합니다.

    Public Sub LongTask(ByVal Duration As Single,
                        ByVal MinimumInterval As Single)
        Dim Threshold As Single
        Dim Start As Single
        Dim blnCancel As Boolean
    
        ' The Timer property of the DateAndTime object returns the seconds
        ' and milliseconds that have passed since midnight.
        Start = CSng(Timer)
        Threshold = MinimumInterval
    
        Do While CSng(Timer) < (Start + Duration)
            ' In a real application, some unit of work would
            ' be done here each time through the loop.
            If CSng(Timer) > (Start + Threshold) Then
                RaiseEvent PercentDone(
                Threshold / Duration, blnCancel)
                ' Check to see if the operation was canceled.
                If blnCancel Then Exit Sub
                Threshold = Threshold + MinimumInterval
            End If
        Loop
    End Sub
    

애플리케이션이 LongTask 메서드를 호출하면 Widget 클래스는 MinimumInterval초마다 PercentDone 이벤트를 발생시킵니다. 이벤트가 반환되면 LongTaskCancel 인수가 True로 설정되었는지 확인합니다.

여기에는 몇 가지 면책 조항이 필요합니다. 간단하게 설명하기 위해 LongTask 프로시저에서는 작업에 소요되는 시간을 미리 알고 있다고 가정합니다. 이런 경우는 거의 없습니다. 작업을 동일한 크기의 청크로 나누는 것은 어려울 수 있으며, 사용자에게 가장 중요한 것은 단순히 어떤 일이 발생했다는 표시를 받기까지 경과하는 시간일 때가 많습니다.

이 샘플에서 또 다른 결함을 발견했을 수도 있습니다. Timer 속성은 자정 이후 경과한 시간(초)을 반환하므로 자정 직전에 애플리케이션을 시작하면 애플리케이션이 멈춥니다. 시간을 측정하는 보다 신중한 접근 방식은 이와 같은 경계 조건을 고려하거나 Now와 같은 속성을 사용하여 이를 완전히 피하는 것입니다.

이제 Widget 클래스가 이벤트를 발생시킬 수 있으므로 다음 단계로 넘어갈 수 있습니다. 연습: 이벤트 처리에서는 WithEvents을 사용하여 이벤트 처리기를 PercentDone 이벤트에 연결하는 방법을 보여 줍니다.

참고 항목