1

我们有一个正常工作的 C# Windows 窗体应用程序来拍摄外部事件的照片,从通过以太网连接的外部硬件发送。现在它应该由浏览器通过 Web 界面而不是 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”-Page 启动与之前相同的过程(在旧的 IEBrowserControl 中),显示下一页,初始化相机,启动外部设备,发送事件,相机在正确的时间拍摄. 到这里就跟以前一样了……

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

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

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

4

2 回答 2

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());
于 2016-03-09T09:03:10.670 回答
0

解决方案:

添加“Application.DoEvents();” 在从外部硬件接收命令并触发相机的循环处解决了我的问题。

于 2014-12-03T09:04:03.380 回答