Canon EDSDK EdsObjectEventHandler не вызывается

У нас есть работающее приложение C# для Windows Forms, которое позволяет снимать внешние события, отправлять их с внешнего оборудования, подключенного через Ethernet. Теперь он должен использоваться Broswser через Webinterface вместо элемента управления Forms.WebBrowser.

Поэтому я добавил минимальный веб-сервер, работающий в потоке:

private void WebServerThread(int port)
{
  try
  {
    //start listing on the given port
    IPAddress localAddr = IPAddress.Parse("127.0.0.1");
    tcpIpListener = new TcpListener(localAddr, (int)port);
    tcpIpListener.Start();
    //start the thread which calls the method 'StartListen'
    Thread th = new Thread(new ThreadStart(StartListen));
    th.Start();
  }
  catch (Exception e)
  {
    ...
  }
}
public void StartListen()
{
  while (bServerRunning)
  {
    ...
    Socket mySocket = tcpIpListener.AcceptSocket();
    ...
    data = getHtmlPageFromSequencer(dataFromClient);
    SendToBrowser(data, ref mySocket);
    ...
  }
}

Открытие "StartWorkAndTakePictures"- страница запускает тот же процесс, что и раньше (в старом IEBrowserControl), отображается следующая страница, инициализируется камера, запускается внешнее устройство, отправляются его события, камера делает снимки в правильное время., До здесь это как раньше...

НО событие "Camera_SDKProgressCallbackEvent" (EDSDK.ObjectEvent_DirItemRequestTransfer = 0x00000208) из Canon-SDK не отправляется (или не распознается), изображения все еще находятся на камере и не загружаются.

Чтобы прояснить это: та же Программа, используемая с WebBrowser-Control в Главном окне, работает нормально - вызывается Событие и загружаются также изображения.

Я думаю, что это проблема цикла сообщений, но я не настолько знаком с C#, чтобы найти ошибку.

2 ответа

После многих исследований, которые я нашел для решения, EDSDK отправляет обратные вызовы через основной поток, который включает цикл сообщений Windows Forms. Поэтому, когда вы создаете объект, который содержит реализацию EDSDK и обратные вызовы, создаете его в этом потоке, это пример

Task.Run(() =>
        {
                    try
                    {

                        if (ConfigurationsManager.Instance.Configurations.Camera == CameraTypes.Nikon)
                            _cameraService = new DslrCameraService(true);
                        else if (ConfigurationsManager.Instance.Configurations.Camera == CameraTypes.CanonEOS1200)
                            _cameraService = new CanonCameraService(true);
                        else if (ConfigurationsManager.Instance.Configurations.Camera == CameraTypes.Multiple)
                            _cameraService = new MultipleCameraService(true);
                    }
                    catch (Exception ex)
                    {
                        throw ex;
                    }
                }

            }, TaskScheduler.FromCurrentSynchronizationContext())

Решение:

Добавление "Application.DoEvents();" в петле, которая получает команды от внешнего оборудования и запускает камеру, решает мою проблему.

Другие вопросы по тегам