我们有一个适当的工作C#窗口窗体应用程序来拍摄外部事件的照片,发送从通过以太网连接的外部硬件。现在它应该由Broswser通过Webinterface使用,而不是Forms.WebBrowser控件。
所以我添加了一个最小的Webserver服务器,在线程中运行:
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#来查找错误。
发布于 2016-03-09 17:03:11
经过许多研究,我找到了解决方案,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());发布于 2014-12-03 17:04:03
解决方案:
在从外部硬件接收命令并触发摄像头的循环中添加"Application.DoEvents();“解决了我的问题。
https://stackoverflow.com/questions/27267220
复制相似问题