이벤트 루프

컴퓨터 과학에서 이벤트 루프(), 메시지 디스패처(), 메시지 루프(), 메시지 펌프(), 런 루프()는 프로그램의 이벤트나 메시지를 대기하다가 디스패치(효율적으로 처리)하는 프로그래밍 구조체이다. 일반적으로 이벤트가 도착할 때까지 요청을 차단하는 일부 내부 또는 외부의 "이벤트 제공자"에게 요청을 한 다음 관련 이벤트 핸들러를 호출한다.(이 때 이벤트를 디스패치한다) 이벤트 제공자가 선택 또는 폴링되는(유닉스 시스템 호출에서 실제로 폴링되지는 않음) 파일 인터페이스를 따르는 경우 이벤트 루프는 반응자와 결합해서 사용할 수 있다. 이벤트 루프는 거의 무조건 메시지 제공자와 비동기식으로 동작한다.

이벤트 루프가 중심 제어 흐름 구조의 프로그램을 형성할 때 이를 메인 루프() 또는 메인 이벤트 루프()라고 할 수 있다. 이벤트 루프가 프로그램 내의 최상위 통제를 받기 때문에 이러한 표현은 적절하다.

 사용법 
그래픽 사용자 인터페이스가 만연해 있기 때문에 현대의 대부분의 응용 프로그램들은 메인 루프 기능을 갖추고 있다. get_next_message() 루틴은 일반적으로 운영 체제에 의해 제공되며 메시지를 사용할 수 있을 때까지 차단한다. 그러므로 루프는 처리할 대상이 있을 때에만 진입된다.

 function main
     initialize()
     while message != quit
         message := get_next_message()
         process_message(message)
     end while
 end function

 파일 인터페이스 
유닉스에서 모든 것이 파일이다 패러다임은 자연적으로 파일 기반 이벤트 루프가 만들어진 계기가 된다. 파일의 읽기/쓰기, 프로세스 간 통신, 네트워크 통신, 장치 제어는 모두 파일 입출력을 통해 수행되며 대상은 파일 서술자에 의해 식별된다. select와 poll 시스템 호출은 파일 서술자 집합이 상태 변화를 감지할 수 있게 한다.(예: 데이터가 읽을 수 있게 될 때)

이를테면 지속적으로 업데이트되는 파일을 읽고 소켓(유닉스 도메인 또는 버클리) 상의 클라이언트와 통신하는 X 윈도 시스템에 내용을 표시하는 프로그램을 고려할 수 있다.
main():
    file_fd = open ("logfile")
    x_fd = open_display ()
    construct_interface ()
    while changed_fds = select ({file_fd, x_fd}):
        if file_fd in changed_fds:
            data = read_from (file_fd)
            append_to_display (data)
            send_repaint_message ()
        if x_fd in changed_fds:
            process_x_messages ()

 같이 보기 
 비동기 입출력
 사건 기반 프로그래밍
 프로세스 간 통신
 메시지 전달

 외부 링크 
 Meandering Through the Maze of MFC Message and Command Routing
 Using Messages and Message Queues (MSDN)
 Using Window Procedures (MSDN)
 WindowProc (MSDN)

분류:제어 흐름
분류:이벤트 (컴퓨팅)