首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >未调用Canon EDSDK EdsObjectEventHandler

未调用Canon EDSDK EdsObjectEventHandler
EN

Stack Overflow用户
提问于 2014-12-03 16:49:43
回答 2查看 654关注 0票数 1

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

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

代码语言:javascript
复制
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中),显示下一页,相机初始化,外部设备启动,发送事件,相机在正确的时间拍摄。到现在为止一切都跟以前一样。

但是来自佳能软件开发工具包的事件"Camera_SDKProgressCallbackEvent“(EDSDK.ObjectEvent_DirItemRequestTransfer = 0x00000208)没有被发送(或识别),图片仍然在相机上,没有下载。

为了清理它:与WebBrowser使用的相同程序-主窗口的控件工作正常-事件被调用,图片也被下载。

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

EN

回答 2

Stack Overflow用户

发布于 2016-03-09 17:03:11

经过许多研究,我找到了解决方案,EDSDK通过启用windows窗体消息循环的主线程发送回调。因此,当您创建保存EDSDK和回调的实现的对象时,请在该线程上创建它,这是一个示例

代码语言:javascript
复制
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
EN

Stack Overflow用户

发布于 2014-12-03 17:04:03

解决方案:

在从外部硬件接收命令并触发摄像头的循环中添加"Application.DoEvents();“解决了我的问题。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/27267220

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档