我正在使用 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)