c++ event 예제

응용 프로그램을 개발할 때 어떤 일이 발생했을 때 일부 작업을 수행할 수 있는 방법이 필요할 때가 있습니다. 이를 위해 일반적으로 필요한 작업을 어떤 장소에 등록하고 관련 작업에 대한 알림을 받았을 때 호출하려고 합니다. 일부 프레임워크에는 이미 .NET 이벤트, Qt 신호 와 같은 요구 에 대한 기본 제공 솔루션이 있습니다. 그러나 내 경우에는 표준 C ++를 사용하여 해당 동작을 구현해야했습니다. 구현할 때마다 동일한 패턴을 반복하는 것을 보았기 때문에 이 일반적인 필요에 대한 일반적인 솔루션이 있으면 좋을 수 있다고 생각했습니다. 그러나 커플링이 문제라는 것을 이해하면 Command 패턴을 사용하지 않도록 할 수 있습니다. 각 정상 작업은 주기적으로 이벤트의 상태를 확인하는 함수를 호출해야 하지만 Command 패턴을 사용하면 이러한 일반 작업은 검사하는 내용에 대해 알 필요가 없으므로 이벤트 처리 코드에서 분리됩니다. 구독 및 구독 취소를 위해 작업 중인 이벤트 소스를 알아야 하므로 클래스에 EvtSrc^ 멤버를 추가하여 작업할 하나의 소스를 나타냅니다. gcnew를 사용하여 매개 변수에 대한 인스턴스에 포인터를 전달하는 대리자 개체를 만듭니다. 예: C++ 표준은 이벤트를 전혀 처리하지 않습니다.

그러나 일반적으로 이벤트가 필요한 경우 해당 이벤트(SDL, Windows, Qt, 그놈 등)와 이를 기다렸다가 디스패치하고 사용하는 방법을 제공하는 프레임워크 내에서 작업하는 경우 가장 먼저 주의해야 할 점은 두 이벤트를 선언하기 위해 이벤트 키워드를 사용하는 것입니다. 발생하려는 각 이벤트에 대해 하나의 이벤트 선언이 필요하며 해당 형식은 이벤트와 연결된 대리자의 선언입니다. 따라서 첫 번째 이벤트 개체의 경우 형식은 FirstEventHandler^와 일치하도록 합니다. 이벤트 키워드를 사용하면 컴파일러가 많은 대리자 처리 코드를 생성합니다. 정확히 무슨 일이 일어나고 있는지에 관심이 있다면 다음 섹션을 참조하십시오. 그런 다음 EvtSrc 클래스의 이벤트 개체를 사용하여 함수 호출인 것처럼 사용하고 적절한 인수를 전달하여 이벤트를 발생시킬 수 있습니다. throw gcnew ArgumentNullException(“이벤트 소스가 있어야 합니다”); 이벤트 클래스가 있는 후에는 이벤트 처리기를 호출하는 함수를 추가할 수 있습니다. 일부 스레드에서 이벤트를 동시에 사용할 수 있으므로 모든 이벤트 처리기가 구현을 완료할 때까지 다른 스레드가 이벤트를 사용하지 못하도록 차단하고 싶지 않습니다(처리기 추가 및 제거, 이벤트 호출). 이벤트 처리기의 복사본입니다. 그런 다음 복사된 처리기를 이동하여 잠그지 않고 호출합니다. 3. 이벤트 소스 클래스의 구현을 다음과 같이 소스 파일에 추가합니다.