Sim*_*mon 5 c# parallel-processing multithreading kinect
我有一个Kinect设备,正在使用C#开发一个程序。
为了管理设备,我使用AllFramesReady事件来处理深度和颜色信息。
我创建了一个事件处理程序来处理名为的数据EventHandler1。我在此事件处理程序中进行了大量处理。
我想在名为的第二个事件处理程序中进行更多计算EventHandler2。
是否有可能在主进程的2个不同线程上并行运行这2个基本上是2个函数的事件处理程序?如果可能的话,请给我一个示例代码来做这个吗?
这很容易在一堂课中完成。但是,在订阅所需的事件之前,您需要将所有事件处理程序聚合到一个事件处理程序中。
这是一个快速而简单的课程来演示这一点。提供的第一个事件与事件调用内联运行,而所有其他事件都在默认线程池上执行。
class ParallelEvent<TEventArg> where TEventArg : EventArgs
{
private readonly EventHandler<TEventArg> _handler1;
private readonly EventHandler<TEventArg>[] _moreHandlers;
public ParallelEvent(EventHandler<TEventArg> handler1, params EventHandler<TEventArg>[] moreHandlers)
{
if (handler1 == null)
throw new ArgumentNullException("handler1");
if (moreHandlers == null)
throw new ArgumentNullException("moreHandlers");
_handler1 = handler1;
_moreHandlers = moreHandlers;
}
public void Handler(Object sender, TEventArg args)
{
IAsyncResult[] asyncResults = new IAsyncResult[_moreHandlers.Length];
for (int i = 0; i < _moreHandlers.Length; i++)
asyncResults[i] = _moreHandlers[i].BeginInvoke(sender, args, null, null);
_handler1(sender, args);
for (int i = 0; i < _moreHandlers.Length; i++)
_moreHandlers[i].EndInvoke(asyncResults[i]);
}
}
Run Code Online (Sandbox Code Playgroud)
现在,为了使用它,我们构造一个 ParallelEvent 类,为它提供我们想要并行运行的所有事件处理程序。然后我们使用类的 Handler 方法订阅事件“test”。最后,我们将该事件称为“测试”并检查输出。考虑以下示例:
private static event EventHandler<EventArgs> test;
static void Main()
{
var e = new ParallelEvent<EventArgs>(Test1, Test2);
test += e.Handler;
test(null, EventArgs.Empty);
}
static void Test1(Object sender, EventArgs args)
{
Console.WriteLine("Start Test 1");
Thread.Sleep(100);
Console.WriteLine("End Test 1");
}
static void Test2(Object sender, EventArgs args)
{
Console.WriteLine("Start Test 2");
Thread.Sleep(100);
Console.WriteLine("End Test 2");
}
Run Code Online (Sandbox Code Playgroud)
正如预期的那样,上面的程序并行运行它们,如以下输出所示:
Start Test 1
Start Test 2
End Test 2
End Test 1
Run Code Online (Sandbox Code Playgroud)
最后,您需要了解有关多线程代码的其他问题。现在更改的任何共享状态都需要同步等。
通过一些工作,您可以调整上面的类来公开事件,以便侦听器可以随意订阅和取消订阅。然后,在 Handler 方法中,您将通过Delgate.GetInitationList () 提取委托列表。一旦获得委托列表,您就可以像上面现有的 Handler 方法一样处理它们。
| 归档时间: |
|
| 查看次数: |
3235 次 |
| 最近记录: |