이벤트와 루프 (폴링이라고 함)의 차이점은 성능 및 자원 소비입니다.
루프 케이스 (폴링)에서 CPU는 항상 활성화되어 키보드를 확인합니다. 이것은 많은 에너지를 사용합니다. 많은 프로그램이 키 누름에 대해 알고 싶어하고 똑같은 일을하는 경우, 전체 PC는 키가 눌러 졌는지 여부를 확인하는 중입니다.
메모 : 밀리 초마다 키 누르기를 확인하려고합니다. 그러나 1 밀리 초가 끝났음을 어떻게 알 수 있습니까? 그러면 다음과 같은 루프가 발생합니다.
long timeBefore = timer();
long timeAfter = timeBefore;
while (timeAfter - time < 1000) // 1000 us = 1 ms
{
timeAfter = timer();
}
이러한 루프를 사용하면 CPU 시간이 100 % (1 코어)가됩니다.
사람들은이 상황을 조기에 인식하고 키 누름과 타이머 틱을 하드웨어로 처리합니다. 하드웨어가 인터럽트를 트리거합니다. 인터럽트는 운영 체제에서 처리하고 이벤트로 변환됩니다. 이것은 타이머 누름 (및 다른 것들)뿐만 아니라 키 누름에도 적용됩니다.
그런 식으로 프로그램이 잠자기 상태가 될 수 있고 CPU가 다른 작업을 수행 할 수 있으며 지정한 이벤트가 발생할 때마다 운영 체제가 프로그램을 시작합니다.
이것은 간략한 설명입니다. 세부 사항은 훨씬 더 복잡합니다. Windows에서 자세한 내용을 알고 싶다면 Mark Russinovich's Windows Internals (특히 3 장)을 읽으십시오. 그러나 두 번째로 읽지 만이 책을 완전히 이해하지 못했습니다.
답변은 귀하가 상대하는 특정 기술에 따라 다릅니다. Windows Forms에서 (예를 들어) 네이티브 Windows 메시지 처리 루프는 작성할 수있는 수동 루프보다 훨씬 더 효율적이라는 확신이 있습니다. –
특히 키를 트랩 할 수 있으면 인터럽트가 발생하여 폴링이 전혀 발생하지 않습니다 (가능성 있음). 이것을 수동으로하지 마십시오! – BradleyDotNET
기본 운영 체제는 이미 입력을 잡는 방법 (폴링/인터럽트)을 가지고 있으며 적절한 응용 프로그램 창에 이벤트를 전달합니다. 직접 폴링을 다시 구현할 필요가 없습니다. – Blorgbeard