방법: 이벤트 발생 및 사용
다음 예제 프로그램에서는 하나의 클래스에서 이벤트를 발생시키고 다른 클래스에서 이벤트를 처리하는 것을 보여 줍니다. AlarmClock 클래스는 공용 이벤트 Alarm을 정의하고 이벤트를 발생시킬 메서드를 제공합니다. AlarmEventArgs 클래스는 EventArgs에서 파생되며 Alarm 이벤트에 연결된 데이터를 정의합니다. WakeMeUp 클래스는 Alarm 이벤트를 처리하는 AlarmRang 메서드를 정의합니다. AlarmDriver 클래스는 클래스를 함께 사용하여 AlarmClock의 Alarm 이벤트를 처리할 WakeMeUp의 AlarmRang 메서드를 설정합니다.
이 예제 프로그램에서는 이벤트 및 대리자와 이벤트 발생시키기에 자세히 설명된 개념을 사용합니다.
예제
Imports System
Namespace EventSample
' Class that contains the data for
' the alarm event. Derives from System.EventArgs.
'
Public Class AlarmEventArgs
Inherits EventArgs
Private _snoozePressed As Boolean
Private nrings As Integer
'Constructor.
'
Public Sub New(snoozePressed As Boolean, nrings As Integer)
Me._snoozePressed = snoozePressed
Me.nrings = nrings
End Sub
' The NumRings property returns the number of rings
' that the alarm clock has sounded when the alarm event
' is generated.
'
Public ReadOnly Property NumRings() As Integer
Get
Return nrings
End Get
End Property
' The SnoozePressed property indicates whether the snooze
' button is pressed on the alarm when the alarm event is generated.
'
Public ReadOnly Property SnoozePressed() As Boolean
Get
Return _snoozePressed
End Get
End Property
' The AlarmText property that contains the wake-up message.
'
Public ReadOnly Property AlarmText() As String
Get
If _snoozePressed Then
Return "Wake Up!!! Snooze time is over."
Else
Return "Wake Up!"
End If
End Get
End Property
End Class
' Delegate declaration.
'
Public Delegate Sub AlarmEventHandler(sender As Object, e As AlarmEventArgs)
' The Alarm class that raises the alarm event.
'
Public Class AlarmClock
Private _snoozePressed As Boolean = False
Private nrings As Integer = 0
Private stopFlag As Boolean = False
' The Stop property indicates whether the
' alarm should be turned off.
'
Public Property [Stop]() As Boolean
Get
Return stopFlag
End Get
Set
stopFlag = value
End Set
End Property
' The SnoozePressed property indicates whether the snooze
' button is pressed on the alarm when the alarm event is generated.
'
Public Property SnoozePressed() As Boolean
Get
Return _snoozePressed
End Get
Set
_snoozePressed = value
End Set
End Property
' The event member that is of type AlarmEventHandler.
'
Public Event Alarm As AlarmEventHandler
' The protected OnAlarm method raises the event by invoking
' the delegates. The sender is always this, the current instance
' of the class.
'
Protected Overridable Sub OnAlarm(e As AlarmEventArgs)
RaiseEvent Alarm(Me, e)
End Sub
' This alarm clock does not have
' a user interface.
' To simulate the alarm mechanism it has a loop
' that raises the alarm event at every iteration
' with a time delay of 300 milliseconds,
' if snooze is not pressed. If snooze is pressed,
' the time delay is 1000 milliseconds.
'
Public Sub Start()
Do
nrings += 1
If stopFlag Then
Exit Do
Else
If _snoozePressed Then
System.Threading.Thread.Sleep(1000)
Else
System.Threading.Thread.Sleep(300)
End If
Dim e As New AlarmEventArgs(_snoozePressed, nrings)
OnAlarm(e)
End If
Loop
End Sub
End Class
' The WakeMeUp class has a method AlarmRang that handles the
' alarm event.
'
Public Class WakeMeUp
Public Sub AlarmRang(sender As Object, e As AlarmEventArgs)
Console.WriteLine((e.AlarmText + ControlChars.Cr))
If Not e.SnoozePressed Then
If e.NumRings Mod 10 = 0 Then
Console.WriteLine(" Let alarm ring? Enter Y")
Console.WriteLine(" Press Snooze? Enter N")
Console.WriteLine(" Stop Alarm? Enter Q")
Dim input As String = Console.ReadLine()
If input.Equals("Y") Or input.Equals("y") Then
Return
Else
If input.Equals("N") Or input.Equals("n") Then
CType(sender, AlarmClock).SnoozePressed = True
Return
Else
CType(sender, AlarmClock).Stop = True
Return
End If
End If
End If
Else
Console.WriteLine(" Let alarm ring? Enter Y")
Console.WriteLine(" Stop Alarm? Enter Q")
Dim input As String = Console.ReadLine()
If input.Equals("Y") Or input.Equals("y") Then
Return
Else
CType(sender, AlarmClock).Stop = True
Return
End If
End If
End Sub
End Class
' The driver class that hooks up the event handling method of
' WakeMeUp to the alarm event of an Alarm object using a delegate.
' In a forms-based application, the driver class is the
' form.
'
Public Class AlarmDriver
Public Shared Sub Main()
' Instantiates the event receiver.
Dim w As New WakeMeUp()
' Instantiates the event source.
Dim clock As New AlarmClock()
' Wires the AlarmRang method to the Alarm event.
AddHandler clock.Alarm, AddressOf w.AlarmRang
clock.Start()
End Sub
End Class
End Namespace
using System;
namespace EventSample
{
// Class that contains the data for
// the alarm event. Derives from System.EventArgs.
//
public class AlarmEventArgs : EventArgs
{
private bool snoozePressed;
private int nrings;
//Constructor.
//
public AlarmEventArgs(bool snoozePressed, int nrings)
{
this.snoozePressed = snoozePressed;
this.nrings = nrings;
}
// The NumRings property returns the number of rings
// that the alarm clock has sounded when the alarm event
// is generated.
//
public int NumRings
{
get { return nrings;}
}
// The SnoozePressed property indicates whether the snooze
// button is pressed on the alarm when the alarm event is generated.
//
public bool SnoozePressed
{
get {return snoozePressed;}
}
// The AlarmText property that contains the wake-up message.
//
public string AlarmText
{
get
{
if (snoozePressed)
{
return ("Wake Up!!! Snooze time is over.");
}
else
{
return ("Wake Up!");
}
}
}
}
// Delegate declaration.
//
public delegate void AlarmEventHandler(object sender, AlarmEventArgs e);
// The Alarm class that raises the alarm event.
//
public class AlarmClock
{
private bool snoozePressed = false;
private int nrings = 0;
private bool stop = false;
// The Stop property indicates whether the
// alarm should be turned off.
//
public bool Stop
{
get {return stop;}
set {stop = value;}
}
// The SnoozePressed property indicates whether the snooze
// button is pressed on the alarm when the alarm event is generated.
//
public bool SnoozePressed
{
get {return snoozePressed;}
set {snoozePressed = value;}
}
// The event member that is of type AlarmEventHandler.
//
public event AlarmEventHandler Alarm;
// The protected OnAlarm method raises the event by invoking
// the delegates. The sender is always this, the current instance
// of the class.
//
protected virtual void OnAlarm(AlarmEventArgs e)
{
AlarmEventHandler handler = Alarm;
if (handler != null)
{
// Invokes the delegates.
handler(this, e);
}
}
// This alarm clock does not have
// a user interface.
// To simulate the alarm mechanism it has a loop
// that raises the alarm event at every iteration
// with a time delay of 300 milliseconds,
// if snooze is not pressed. If snooze is pressed,
// the time delay is 1000 milliseconds.
//
public void Start()
{
for (;;)
{
nrings++;
if (stop)
{
break;
}
else
{
if (snoozePressed)
{
System.Threading.Thread.Sleep(1000);
}
else
{
System.Threading.Thread.Sleep(300);
}
AlarmEventArgs e = new AlarmEventArgs(snoozePressed, nrings);
OnAlarm(e);
}
}
}
}
// The WakeMeUp class has a method AlarmRang that handles the
// alarm event.
//
public class WakeMeUp
{
public void AlarmRang(object sender, AlarmEventArgs e)
{
Console.WriteLine(e.AlarmText +"\n");
if (!(e.SnoozePressed))
{
if (e.NumRings % 10 == 0)
{
Console.WriteLine(" Let alarm ring? Enter Y");
Console.WriteLine(" Press Snooze? Enter N");
Console.WriteLine(" Stop Alarm? Enter Q");
String input = Console.ReadLine();
if (input.Equals("Y") ||input.Equals("y"))
{
return;
}
else if (input.Equals("N") || input.Equals("n"))
{
((AlarmClock)sender).SnoozePressed = true;
return;
}
else
{
((AlarmClock)sender).Stop = true;
return;
}
}
}
else
{
Console.WriteLine(" Let alarm ring? Enter Y");
Console.WriteLine(" Stop Alarm? Enter Q");
String input = Console.ReadLine();
if (input.Equals("Y") || input.Equals("y"))
{
return;
}
else
{
((AlarmClock)sender).Stop = true;
return;
}
}
}
}
// The driver class that hooks up the event handling method of
// WakeMeUp to the alarm event of an Alarm object using a delegate.
// In a forms-based application, the driver class is the
// form.
//
public class AlarmDriver
{
public static void Main(string[] args)
{
// Instantiates the event receiver.
WakeMeUp w = new WakeMeUp();
// Instantiates the event source.
AlarmClock clock = new AlarmClock();
// Wires the AlarmRang method to the Alarm event.
clock.Alarm += new AlarmEventHandler(w.AlarmRang);
clock.Start();
}
}
}
using namespace System;
namespace EventSample
{
// Class that contains the data for
// the alarm event. Derives from System.EventArgs.
//
public ref class AlarmEventArgs : EventArgs
{
private:
bool snoozePressed;
int nrings;
public:
//Constructor.
//
AlarmEventArgs(bool snoozePressed, int nrings)
{
this->snoozePressed = snoozePressed;
this->nrings = nrings;
}
// The NumRings property returns the number of rings
// that the alarm clock has sounded when the alarm event
// is generated.
//
property int NumRings
{
int get() { return nrings;}
}
// The SnoozePressed property indicates whether the snooze
// button is pressed on the alarm when the alarm event is generated.
//
property bool SnoozePressed
{
bool get() {return snoozePressed;}
}
// The AlarmText property that contains the wake-up message.
//
property String^ AlarmText
{
String^ get()
{
if (snoozePressed)
{
return ("Wake Up!!! Snooze time is over.");
}
else
{
return ("Wake Up!");
}
}
}
};
// Delegate declaration.
//
public delegate void AlarmEventHandler(Object^ sender, AlarmEventArgs^ e);
// The Alarm class that raises the alarm event.
//
public ref class AlarmClock
{
private:
bool snoozePressed;
int nrings;
bool stop;
// The Stop property indicates whether the
// alarm should be turned off.
//
public:
AlarmClock()
{
snoozePressed = false;
nrings = 0;
stop = false;
}
property bool Stop
{
bool get() {return stop;}
void set(bool value) {stop = value;}
}
// The SnoozePressed property indicates whether the snooze
// button is pressed on the alarm when the alarm event is generated.
//
property bool SnoozePressed
{
bool get() {return snoozePressed;}
void set(bool value) {snoozePressed = value;}
}
// The event member that is of type AlarmEventHandler.
//
event AlarmEventHandler^ Alarm;
// The protected OnAlarm method raises the event by invoking
// the delegates. The sender is always this, the current instance
// of the class.
//
protected:
virtual void OnAlarm(AlarmEventArgs^ e)
{
Alarm(this, e);
}
public:
// This alarm clock does not have
// a user interface.
// To simulate the alarm mechanism it has a loop
// that raises the alarm event at every iteration
// with a time delay of 300 milliseconds,
// if snooze is not pressed. If snooze is pressed,
// the time delay is 1000 milliseconds.
//
void Start()
{
for (;;)
{
nrings++;
if (stop)
{
break;
}
else
{
if (snoozePressed)
{
System::Threading::Thread::Sleep(1000);
}
else
{
System::Threading::Thread::Sleep(300);
}
AlarmEventArgs^ e = gcnew AlarmEventArgs(snoozePressed, nrings);
OnAlarm(e);
}
}
}
};
// The WakeMeUp class has a method AlarmRang that handles the
// alarm event.
//
public ref class WakeMeUp
{
public:
void AlarmRang(Object^ sender, AlarmEventArgs^ e)
{
Console::WriteLine(e->AlarmText + "\n");
if (!(e->SnoozePressed))
{
if (e->NumRings % 10 == 0)
{
Console::WriteLine(" Let alarm ring? Enter Y");
Console::WriteLine(" Press Snooze? Enter N");
Console::WriteLine(" Stop Alarm? Enter Q");
String^ input = Console::ReadLine();
if (input->Equals("Y") ||input->Equals("y"))
{
return;
}
else if (input->Equals("N") || input->Equals("n"))
{
((AlarmClock^)sender)->SnoozePressed = true;
return;
}
else
{
((AlarmClock^)sender)->Stop = true;
return;
}
}
}
else
{
Console::WriteLine(" Let alarm ring? Enter Y");
Console::WriteLine(" Stop Alarm? Enter Q");
String^ input = Console::ReadLine();
if (input->Equals("Y") || input->Equals("y"))
{
return;
}
else
{
((AlarmClock^)sender)->Stop = true;
return;
}
}
}
};
// The driver class that hooks up the event handling method of
// WakeMeUp to the alarm event of an Alarm object using a delegate.
// In a forms-based application, the driver class is the
// form.
//
public ref class AlarmDriver
{
public:
static void Main()
{
// Instantiates the event receiver.
WakeMeUp^ w= gcnew WakeMeUp();
// Instantiates the event source.
AlarmClock^ clock = gcnew AlarmClock();
// Wires the AlarmRang method to the Alarm event.
clock->Alarm += gcnew AlarmEventHandler(w, &WakeMeUp::AlarmRang);
clock->Start();
}
};
}
int main()
{
EventSample::AlarmDriver::Main();
}