2014-12-02 3 views
0

이벤트가 실제로 어떻게 작동하는지 이해하는 데 어려움이 있습니다.C# events vs loop

내가 밀리 초마다 키보드에서 문자 'a'를 눌렀는지 확인하는 루프가 있다고 가정 해보십시오. 동일한 설정의 이벤트와 다른 점은 무엇입니까? 이벤트를 트리거하기 위해 키를 눌렀는지 확인하기 위해 항상 체크하지 않아도됩니까? 루프처럼 오버 헤드가 발생할 때마다주의를 기울여야합니다. 아니면 끊임없이 점검하지 않고 어떻게 작동 하는지를 나에게 알리지 않는 휴면 상태입니다.

+1

답변은 귀하가 상대하는 특정 기술에 따라 다릅니다. Windows Forms에서 (예를 들어) 네이티브 Windows 메시지 처리 루프는 작성할 수있는 수동 루프보다 훨씬 더 효율적이라는 확신이 있습니다. –

+2

특히 키를 트랩 할 수 있으면 인터럽트가 발생하여 폴링이 전혀 발생하지 않습니다 (가능성 있음). 이것을 수동으로하지 마십시오! – BradleyDotNET

+0

기본 운영 체제는 이미 입력을 잡는 방법 (폴링/인터럽트)을 가지고 있으며 적절한 응용 프로그램 창에 이벤트를 전달합니다. 직접 폴링을 다시 구현할 필요가 없습니다. – Blorgbeard

답변

1

이벤트와 루프 (폴링이라고 함)의 차이점은 성능 및 자원 소비입니다.

루프 케이스 (폴링)에서 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 장)을 읽으십시오. 그러나 두 번째로 읽지 만이 책을 완전히 이해하지 못했습니다.

+0

내가 지금 이해하고있는 누구나에게 감사드립니다. 그리고 필자는 필자가 필요하다면 "russinovich의 창문 내부를 읽으면서"더 깊게 보게 될 것이다. – noob

2

이벤트가 실제로 어떻게 작동하는지.

키보드 이벤트를 처리하는 코드는 휴면 상태에 있다고 생각합니다. 하드웨어 이벤트가 발생하면 CPU는 키보드 이벤트 처리기의 주소가있는 레지스터를로드하고 실행합니다.

폴링이 없습니다.

0

응용 프로그램에서 여러 조건을 검사하고 비동기 작업을하는 루프가 많지 않습니다. 이벤트가있는 OperatingSystem은 모든 메시지 (이벤트) (OS의 실제 루프)를 수신 한 다음 가입 한 이벤트를 응용 프로그램과 함께 전달합니다.