0

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

因此,经过进一步研究,我发现我需要启动表单Application.Run()才能接收回调的 Windows 消息。所以目前,我在 UI-Form 中运行 EDSDK,它为我提供了我想要的功能。我建立在一个很棒的工具箱上,可以在这里找到:http: //www.codeproject.com/Articles/688276/Canon-EDSDK-Tutorial-in-Csharp。但是,我遇到了我的应用程序冻结的情况,很可能是由于系统缺少相机回调。(至少这是我的假设)

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

4

1 回答 1

3

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

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

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

我计划一有时间就用上面提到的更改更新 codeproject 库。

于 2016-02-19T20:51:27.127 回答