没有调用Canon EDSDK EdsObjectEventHandler

时间:2014-12-03 08:49:43

标签: c# edsdk canon-sdk

我们有一个正常工作的C#Windows窗体应用程序,可以在外部事件上拍照,从以太网连接的外部硬件发送。 现在它应该由Broswser通过Web接口而不是Forms.WebBrowser控件使用。

所以我添加了一个在线程中运行的最小Web服务器:

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”-Page启动与之前相同的过程(在旧的IEBrowserControl中),显示下一页,启动摄像头,启动外部设备,发送事件,摄像头拍摄正确的时间。 到此为止,就像之前......

但未发送(或识别)Canon-SDK中的事件“Camera_SDKProgressCallbackEvent”(EDSDK.ObjectEvent_DirItemRequestTransfer = 0x00000208),图片仍然在相机上而未下载。

要清除它:与主窗口的WebBrowser-Control一起使用的相同程序工作正常 - 调用事件并下载图片。

我认为这是一个消息循环问题,但我不太熟悉C#来解决错误。

2 个答案:

答案 0 :(得分:1)

经过多次研究后我得到了解决方案,EDSDK通过主线程发送回调,启用windows窗体消息循环。 因此,当您创建包含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())

答案 1 :(得分:0)

解决方案:

添加" Application.DoEvents();"在Loop接收来自外部硬件的命令并触发相机解决了我的问题。