繁忙时阻止函数运行(或队列)

时间:2018-02-21 08:52:08

标签: vb.net

我有一个实时视频流我试图操纵以确定图像是否对焦。为实现这一目标,我将aforge.net与sobel运营商一起使用。我遇到的问题是因为流速度太快,我创建的函数在再次被调用之前没有完成,因此它出错了。

我开始按照以下方式接收视频流;

start

这会调用我的Return Sobel函数,如下所示,用于更新PictureBox控件;

Private Sub Video_NewFrame(ByVal sender As Object, ByVal eventArgs As NewFrameEventArgs)
        Dim img As Bitmap = CType(eventArgs.Frame.Clone, Bitmap)
        'do processing here

        img_src.Image = img
        img_sobel.Image = ReturnSobel(img)
    End Sub

我试图使用一个队列,在程序开始时我将q声明为新队列(位图),然后在newframe sub中将img添加到队列中,然后在一个计时器中我尝试从最后一帧拉出队列和出队但是虽然队列不断增长(至少基于内存使用量),但sobel函数似乎从未被调用过。

我把它分开了一点,但我的队列概念就在这里;

Public Function ReturnSobel(InputImg1 As Bitmap) As Bitmap
    Dim filter1 As SobelEdgeDetector = New SobelEdgeDetector
    Dim GrayImage1 As Bitmap = Grayscale.CommonAlgorithms.BT709.Apply(InputImg1)
    filter1.ApplyInPlace(GrayImage1)
    Return GrayImage1
    filter1 = Nothing
    GrayImage1 = Nothing
End Function

我是否对队列概念做错了,还是有更好的方法来实现这个目标?

非常感谢!

1 个答案:

答案 0 :(得分:0)

玛丽很喜欢,使用SyncLock是完美的。最后,我宣布了一个新的位图参数(sobel)并将新帧中的img引入该参数,将synclock应用于该参数,然后在结束synclock之前运行视觉功能。

> Private Sub Video_NewFrame(ByVal sender As Object, ByVal eventArgs As
> NewFrameEventArgs)
>         Dim img As Bitmap = CType(eventArgs.Frame.Clone, Bitmap)
>         Dim Sobel as Bitmap = img
>         img_src.Image = img 'do processing here
>     SyncLock Sobel
>          img_sobel.Image = ReturnSobel(Sobel)
>     End SyncLock
>     End Sub