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();" в петле, которая получает команды от внешнего оборудования и запускает камеру, решает мою проблему.