在C#中的并行任务中运行EDSDK

时间:2016-02-18 21:16:12

标签: c# winforms edsdk

这是一个概念性问题:我想在Windows.Form应用程序中运行Canon EDSDK。理想情况下,我想将我的数据与我的ui和我的模型分开。具体来说,这意味着来自我的EDSDK相机对象的windows.form。通过四处寻找,试图让相机独立于我的表格运行,我在这里发现了这个帖子changelog,它基本上描述了我最初使用EDSDK的经历。

因此,经过进一步研究后,我发现我需要使用Application.Run()启动表单,以便接收回调的Windows消息。所以暂时,我在UI-Form中运行EDSDK,它给了我想要的功能。我建立了一个很棒的工具箱,可以在这里找到:EDSDK callbacks not working。 然而,我来体验我的应用程序冻结,很可能是因为系统缺少相机回调。 (至少这是我的假设)

所以我想做的是回到我最初的想法,在单独的任务中运行EDSDK,从而能够分离原因并调试任何问题。我在其他几个帖子中看到,运行多个Application.Run()命令是一个坏主意或不好的做法。但是,我还没有提出如何以不同方式构建程序结构的想法。我希望能为此目的在更好的架构上提供一些意见。

1 个答案:

答案 0 :(得分:2)

此处链接文章的作者。要进行干净的分离,您可以为SDK事件启动专用线程。 在我的商业图书馆中,它看起来像这样:

  • 事件循环:调用EdsGetEvent的STA线程(由锁定包围)。您需要在此线程上调用EdsInitializeSDK才能被识别为SDK的主线程。
  • 摄像头:调用任何与摄像头相关的SDK功能的STA线程(由与事件循环相同的锁包围)
  • SDK事件:将在Event Loop线程上运行。您可能希望在调用UI之前启动另一个线程(线程池)(因为死锁)

这样您就不会遇到死锁问题,SDK和UI代码完全分开。 当然,这也意味着您必须使用正确的线程同步来执行每个特定线程上的函数。

我正计划在有时间的情况下使用上述更改来更新codeproject库。