Запуск EDSDK в параллельной задаче на C#

Это концептуальный вопрос: я хочу запустить Canon EDSDK в приложении Windows.Form. Теперь в идеале я хотел бы отделить свои данные от моего пользовательского интерфейса и моей модели. В частности, это означает мой windows.form из моего объекта камеры EDSDK. Ковыряясь, пытаясь заставить камеру работать независимо от моей формы, я наткнулся на эту публикацию здесь «>Обратные вызовы EDSDK не работают, что в основном описывает мой начальный опыт работы с EDSDK.

Итак, после дальнейших исследований я увидел, что мне нужно начать форму с Application.Run(), чтобы получать сообщения Windows для обратных вызовов. Так что пока я запускаю EDSDK в UI-Form, что дает мне нужные мне функции. Я опираюсь на отличный инструментарий, который можно найти здесь: http://www.codeproject.com/Articles/688276/Canon-EDSDK-Tutorial-in-Csharp. Однако я столкнулся с зависанием моего приложения, скорее всего, из-за того, что в системе отсутствует обратный вызов камеры. (по крайней мере это мое предположение)

Итак, что я хотел бы сделать, так это вернуться к своей первоначальной идее запускать EDSDK в отдельной задаче, чтобы иметь возможность отделять причины и устранять любые проблемы. Я видел в нескольких других публикациях, что запуск нескольких команд Application.Run() — плохая идея или плохая практика. Однако я так и не придумал, как по-другому построить структуру моей программы. Я хотел бы внести свой вклад в лучшую архитектуру для этой цели.


person JoeyD    schedule 18.02.2016    source источник


Ответы (1)


Автор статьи по ссылке здесь. Чтобы сделать четкое разделение, вы можете запустить выделенный поток для событий SDK. В моей коммерческой библиотеке это выглядит так:

  • Цикл событий: поток STA, который вызывает EdsGetEvent (окруженный блокировкой). Вам нужно вызвать EdsInitializeSDK в этом потоке, чтобы он был распознан как основной поток SDK.
  • Камера: поток STA, который вызывает любые функции SDK, связанные с камерой (окруженный тем же замком, что и цикл событий).
  • События SDK: будут выполняться в потоке цикла событий. Вы можете запустить другой поток (пул потоков) перед вызовом пользовательского интерфейса (из-за взаимоблокировок)

Таким образом, у вас не будет проблем с взаимоблокировками, а код SDK и пользовательского интерфейса будет полностью разделен. Конечно, это также означает, что вы должны использовать правильную синхронизацию потоков для выполнения функций в каждом конкретном потоке.

Я планирую обновить библиотеку codeproject с упомянутыми изменениями, как только у меня будет время.

person Johannes Bildstein    schedule 19.02.2016
comment
Эй, как же это круто! Большое спасибо за ваш комментарий. Я посмотрю на это - не привык к нитям, так что это займет меня, но спасибо, что указали мне правильное направление! - person JoeyD; 20.02.2016