2009-08-12 6 views
5

foo() 함수가 실행되고 있다고 가정 해 보겠습니다. 핸들러가있는 외부 이벤트가 발생한다고 가정합니다. foo() 함수가 인터럽트되어 이벤트 핸들러가 실행될 수 있습니까? 이 상황에서 처형 명령은 무엇입니까?이벤트 디스패치가 함수를 인터럽트합니까?

+0

은 하나의 스레드에서 실행중인 앱 플렉스에 관련된 또 다른 "스레드"입니다 : http://stackoverflow.com/questions/1108772/flex-single-threaded-model-are-you-kidding-me - James –

답변

1

실제로 이것은 매우 까다 롭습니다.

나는 Flash가이 점에서 어떻게 작동하는지 실제로 모르지만, 예를 들어 C#에서는 두 가지 경우가 있습니다. 이 물건이 어떻게 작동하는지에 대해 읽어 보시기 바랍니다. 또한 디버거를 중단하고 이벤트 처리기로 인도하는 스택을 검사하여 감각을 얻는 것이 좋습니다.

은 기본적으로 두 가지 시나리오 중 하나가 일어나고있다 :

  1. Dr_Asik 말씀처럼

    , 당신은 직접 동기 메소드를 호출처럼 정확히 대리자 이벤트를 호출 할 수 있습니다. 이 경우 스레드 컨텍스트 전환에 대한 일반 규칙이 적용되지만 이벤트에는 특별한 속성이 없습니다. 함수 호출 일뿐입니다.

  2. UI 양식 이벤트에 대해 이야기 할 수 있습니다. 이 경우 몇 가지 특별한 규칙이 적용됩니다. UI 이벤트는 동 기적으로 실행되는 것이 아니라 이벤트 대기열에 "게시"됩니다. 따라서 foo()가 "Main"UI 스레드에 있으면 foo()가 실행되는 동안 사용자가 키를 누른 다음 키 누르기가 OS에 의해 트랩되고 응용 프로그램의 UI 이벤트 대기열에 게시됩니다. 그러나 foo()가 이미 실행 중이기 때문에 주 스레드는 해당 큐를 중지하고 검사하지 않습니다. foo()의 전체 호출 스택이 메시지 대기열 검사 루프로 끝나면 주 스레드는 해당 메시지를 찾아 처리하고 처리기를 호출합니다.

분명히 말해서 마지막 사건 인 foo()가 UI 이벤트에 의해 중단되지 않는다는 것이 보증됩니다.

그러나 2 경우에는 foo()가 기본 UI 스레드에없는 또 다른 시나리오가 있습니다. 이 경우 정상적인 컨텍스트 전환으로 절대 중단 될 수 있습니다.

C#에서는 Control.Invoke()를 사용하기 시작하면 더 어려워 질 수 있습니다.

이것은 플래시와 관련이 없지만 도움이되기를 바랍니다. 나는 Flash가 C#처럼 이벤트 큐와 처리 루프가있는 메인 스레드를 가지고 있다고 의심한다. 적어도 C#, Java 및 Delphi에서 찾을 수있는 공통 모델입니다.

+0

+1. 좋은 요점 –

+0

질문과 관련이 없습니다. 질문은 플래시 플레이어를 대상으로합니다. –

+0

@ bug-a-lot. 그러나 설명 된 모델은 플래시 플레이어에 적용 할 수 있습니다. –

5

아니요, foo()은 중단되지 않습니다.

플렉스는 단일 스레드이므로 foo()은 계속 실행됩니다. foo()가 끝나고 컨트롤이 이벤트 루프로 반환되면 이벤트 큐의 첫 번째 이벤트가 처리됩니다. 여기

+1

이것은 정확하지만 조금만 설명합니다. Flash Player의 코드 실행은 단일 스레드입니다. Flex 어플리케이션은 단일 스레드에서 실행됩니다. 그러나 네트워크 요청이 UI를 차단하지 않도록 네트워크 IO와 같은 별도의 스레드에서 실행되는 Flash Player의 기능이 있습니다. –

+0

이것은 모든 이벤트 파견에 사실이 아님을 두려워합니다. 이벤트 메커니즘은 본질적으로 비동기 적이 지 않습니다.그것은 콜백으로 내려 간다. 플레이어의 API에서 전달되는 대부분의 이벤트는 사용자 동작, flash.net 패키지 등에서 생성되는 이벤트와 마찬가지로 비동기 적으로 발생합니다. –

+0

사용자의 특정 질문에 대한 답변은 여전히 ​​"아니오"입니다. , 중단되지 않습니다 ". 새로운 이벤트에 대한 사용자의 이벤트 핸들러는 foo()가 완료 될 때까지 실행되지 않습니다. –

관련 문제