2009-08-12 24 views
5

Powiedzmy, że funkcja foo() jest wykonywana. Załóżmy, że występuje zdarzenie zewnętrzne, dla którego masz program obsługi. Czy funkcja foo() zostanie przerwana, aby można było uruchomić procedurę obsługi zdarzeń? Jaka jest kolejność wykonywania w tej sytuacji?Czy wywołanie zdarzenia przerywa działanie?

+0

Oto kolejny „gwint” odnoszące się do Flex aplikacje uruchomione w jednym wątku: http://stackoverflow.com/questions/1108772/flex-single-threaded-model-are-you-kidding-me - James –

Odpowiedz

1

To może być dość trudne.

Nie wiem, jak działa Flash w tym zakresie, ale na przykład w C# jest kilka przypadków. Sugeruję, abyś przeczytał, jak to działa. Dobrze jest też włamać się do debuggera i zbadać stos, który doprowadził do twojego programu obsługi zdarzeń, aby uzyskać sens.

Zasadniczo jest jeden z dwóch scenariuszy dzieje:

  1. Jak Dr_Asik mówi, można być bezpośrednio powołując zdarzenie delegata, który jest dokładnie jak wywołanie metody synchronicznie. W takim przypadku obowiązują normalne reguły dotyczące przełączania kontekstu wątku, ale zdarzenie nie ma żadnych specjalnych właściwości. To tylko wywołanie funkcji.

  2. Możesz mówić o wydarzeniach z Form UI. W takim przypadku obowiązują pewne specjalne zasady. Zdarzenie interfejsu użytkownika zostaje "zaksięgowane" w kolejce zdarzeń, a nie jest wykonywane synchronicznie. Jeśli więc foo() znajduje się w wątku "Main" interfejsu użytkownika, to użytkownik naciśnie klawisz podczas działania foo(), następnie naciśnięcie klawisza zostaje uwięzione przez system operacyjny i umieszczone w kolejce zdarzeń interfejsu użytkownika aplikacji. Ale foo() już działa, więc główny wątek nie zatrzyma się i sprawdzi kolejkę. Dopiero, gdy cały stos wywołania foo() zakończy działanie z powrotem do pętli sprawdzania kolejki komunikatów, główny wątek znajdzie ten komunikat, przetworzy go i wywoła jego procedurę obsługi.

Aby było jasne, w tym ostatnim przypadku foo() gwarantuje, że nie zostanie przerwane przez zdarzenie interfejsu użytkownika.

Jednak w przypadku 2 istnieje inny scenariusz, w którym foo() nie znajduje się w głównym wątku UI. W takim przypadku można całkowicie przerwać normalne przełączanie kontekstów.

W języku C# może to być jeszcze trudniejsze, jeśli zaczniesz używać Control.Invoke().

Nie jest to specyficzne dla Flasha, ale mam nadzieję, że pomaga. Podejrzewam, że Flash ma główny wątek z kolejką zdarzeń i pętlą przetwarzania, podobnie jak C#. Jest to popularny model, który można znaleźć w C#, Java i Delphi.

+0

+1. Fajne przypomnienie. –

+0

Nie dotyczy pytania. Pytanie dotyczy odtwarzacza Flash. –

+0

@ bug-a-lot. Ale opisany model dotyczy odtwarzacza flash. –

5

Nie, foo() nie zostanie przerwany.

Flex jest jednowątkowy, więc foo() będzie nadal działać. Po zakończeniu foo() i przywróceniu kontroli do pętli zdarzeń, przetwarzane jest pierwsze zdarzenie w kolejce zdarzeń.

+1

To prawda, ale pozwól mi wyjaśnić tylko trochę. Wykonywanie kodu w programie Flash Player jest jednokrotne. Tak więc aplikacje Flex działają na jednym wątku. W programie Flash Player istnieją jednak pewne rzeczy, które działają w oddzielnych wątkach, takich jak sieć IO - aby żądania sieciowe nie blokowały interfejsu użytkownika. –

+0

Obawiam się, że nie dotyczy to wszystkich wysyłek zdarzeń. Mechanizm zdarzeń nie jest wewnętrznie asynchroniczny.To naprawdę zależy od callbacków. Prawdą jest, że większość zdarzeń wywoływanych przez API odtwarzacza jest uruchamianych asynchronicznie, jak te generowane przez gesty użytkowników, pakiet flash.net itp. –

+0

Niezależnie od tego, odpowiedź na konkretne pytanie użytkownika nadal brzmi "Nie" , nie zostanie przerwany ". Obsługa zdarzeń użytkownika dla zupełnie nowego zdarzenia nie zostanie wykonana dopóki nie zakończy się foo(). –

Powiązane problemy