假设函数foo()正在执行。假设发生了一个外部事件,你有一个处理程序。函数foo()会被中断,以便可以执行事件处理程序吗?在这种情况下执行的顺序是什么?
答案 0 :(得分:5)
不,foo()
不会被打断。
Flex是单线程的,因此foo()
将继续运行。一旦foo()完成并且控制返回到事件循环,那么将处理事件队列中的第一个事件。
答案 1 :(得分:1)
这实际上可能很棘手。
我真的不知道Flash在这方面是如何工作的,但是例如C#中有几种情况。我建议你阅读这些东西是如何工作的。同样很好的是打破调试器并检查导致您的事件处理程序的堆栈以了解它。
基本上有两种情况中的一种:
就像Dr_Asik所说,你可以直接调用一个委托事件,就像同步调用一个方法一样。在这种情况下,关于线程上下文切换的常规规则适用,但事件确实没有特殊属性。这只是一个函数调用。
您可能正在谈论UI Forms事件。在这种情况下,一些特殊规则确实适用。 UI事件被“发布”到事件队列,而不是同步执行。因此,如果foo()位于“Main”UI线程上,则用户在foo()运行时按下一个键,然后操作系统将该按键捕获并发布到应用程序的UI事件队列中。但是foo()已经在运行,因此主线程不会停止并检查该队列。只有当foo()的整个调用堆栈一直完成回到消息队列检查循环时,主线程才会找到该消息,处理它并调用其处理程序。
要明确的是,在最后一种情况下,保证foo()不会被UI事件中断。
但是,在情况2中还有另一种情况,其中foo()不在主UI线程上。在这种情况下,通过正常的上下文切换,它绝对可以被中断。
在C#中,如果你开始使用Control.Invoke(),它会变得更加棘手。
这不是特定于Flash的,但我希望它有所帮助。我怀疑Flash有一个带有事件队列和处理循环的主线程,就像C#一样。这是至少在C#,Java和Delphi中找到的常见模型。