0

我正在使用 Point Grey 的 FlyCapture API 来驱动一些相机。在公共类中,我实现了所有的启动和初始化代码;下面的 _cam 指的是 ManagedGigECamera。因为我有16个摄像头,我希望代码尽可能快,所以我想使用任务。

这是我使用的代码:


    _cam.StartCapture(AddressOf OnImageGrabbed)

.../...

     Public Sub OnImageGrabbed(ByVal raw_image As ManagedImage)
                Dim t As Task = Task.Run(Sub() 
                                     'save image to disk or whatever
                                         End Sub)
                t.Wait()
     End Sub

以上给出了-排序-满意。通过查看图像时间戳,我可以看到一些图像在它们被抓取后几秒钟内被保存,甚至一些图像被完全跳过......我想确保每次调用 OnImageGrabbed 都会启动一个新任务,并尝试了以下操作,但是它立即因“对象未设置为对象的实例”而崩溃(无法真正调试,代码正在远程机器上运行)



    _cam.StartCapture(AddressOf OnImageGrabbed)

.../...

     Public Async Sub OnImageGrabbed(ByVal raw_image As ManagedImage)
                Await Task.Run(Sub() 
                                     'save image to disk or whatever
                                         End Sub)
     End Sub

总而言之,我的问题是:

  • 如何异步运行事件处理程序?
  • 为什么,使用第一个代码,我会在每次调用 OnImageGrabbed 之间得到(似乎是)随机延迟?我的意思是图像时间戳之间的时间差异永远不会相同,并且从长远来看往往会增加(前几张图像几乎是同步的,但在 1 分钟左右之后,每张图像之间的间隔越来越长)。内存泄漏 ?GC ?

提前感谢您的任何提示!

编辑:最后我改变了系统的工作方式:我使用计时器在每个相机上触发软件触发器,并且每个触发器“并行”触发:

Parallel.ForEach(Of ListOfCameras)(SingleCamera, 
      Sub(aCamera, loopstate, num)
            aCamera.FireTrigger()
      End Sub)
4

1 回答 1

1

开始一项任务,然后立即阻止它(通过Wait)让你一无所获。您也可以直接运行保存图像代码。

第二个例子实际上是异步的。您可能会遇到异常,因为ManagedImage正在处理参数或其子对象之一。请记住,引发事件的代码不知道您的代码是异步的;如果您要异步使用它,您可以从事件参数中复制出您需要的内容。

于 2014-11-17T13:00:21.373 回答