2011-12-07 75 views
0

我有一个类创建作为一个线程。哪个线程是处理对象的事件处理?

在那个类中,我创建了一个对象。这个对象有一个事件,它对我的​​线程类中创建的方法执行回调。

那么,我的主应用程序/ GUI线程创建这个线程&启动它。

此时,我的主要GUI线程处于空闲状态(等待键盘事件)&我的线程的execute方法位于无限循环(等待终止)。

然后,创建的对象检测到一些事件,触发一个事件,这会触发回调到线程类方法。

接下来的问题是,这个方法执行哪个线程/进程? 我的主应用程序线程(& GUI处理程序)? 或者我开始的线程,它创建了触发事件/回调的对象?

我假设主应用程序线程被中断。这是正确的吗?

+0

您还没有提供足够的信息来说明执行回调的线程。回调可能是一个APC排队到创建该对象的线程(即'我开始的线程'),或直接从内核线程回调或从另一个进程通过线程回调。共享内存。您的主应用程序线程可能会或可能不会在回调时运行 - 通常,对于任何可能正在运行主线程的处理器内核而言,没有理由因为某些回调已被某些地方执行而被中断线。 –

+0

@马丁詹姆斯他没有提供足够的信息,因为他是通灵但忘了我们不是:) –

回答

0

这里没有什么魔法,事件处理程序只是简单地运行在与触发事件的代码相同的线程上。当你希望事件处理程序更新UI时,这总是很麻烦,这不是从创建UI对象的任何线程执行合法的。

您将不得不将工作线程的调用编组到UI线程。无论您使用UI实现什么样的类库,它都会受到支持。你没有说,它闻起来像Winforms,在这种情况下,你使用Control :: BeginInvoke()。如果它是原始Windows,那么你使用PostMessage()。等等。

0

回调在等待事件并调用回调的线程上执行。在这种情况下,它是你的工作线程。

您的主线程(GUI线程)不会中断,不计算操作系统中断执行潜在的上下文切换。