在用VB.NET读取visionprio的拍照结果时,有时会没有新的值获得,程序一直卡在时钟的ResultGot这里,没有进入myJobManager_UserResultAvailable
程序基本是按照康耐视官网的教学视频来的
Imports System.ComponentModel
Imports Cognex.VisionPro
Imports Cognex.VisionPro.QuickBuild
Public Class Form1
Public inifilepath As String = "D:\ST02\bin\binexe\Files\CONF.ini"
Dim JobStart_f As String = ""
Dim Jobworking As Boolean = False
Dim JobNo As String = ""
Dim JobPath As String = ""
Dim ResultGot As Boolean = False
'Public Blob_Output_Area As Integer = 0
Dim Blob_Output_Area As Integer = 0
Private Delegate Sub mydelegate()
Public outputinfo As String = ""
Private WithEvents myJobManager As New CogJobManager
Private myJob As CogJob
Private myIndependentJob As CogJobIndependent
Private savefolder As String
Private savefile As String
Private savepath As String = "D:\01_Picture\"
Private Sub frm_Load(sender As Object, e As EventArgs) Handles Me.Load
savefolder = Now.Year.ToString + Now.Month.ToString + Now.Day.ToString
savepath = savepath + savefolder + "\"
If My.Computer.FileSystem.DirectoryExists(savepath) Then
Else
My.Computer.FileSystem.CreateDirectory(savepath)
End If
Timer1.Enabled = True
End Sub
Private Sub InitializeJobManager(ByVal Jobfilepath As String)
'Depersist the QuickBuild session
myJobManager = CType(CogSerializer.LoadObjectFromFile(Jobfilepath), CogJobManager)
myJob = myJobManager.Job(0)
myIndependentJob = myJob.OwnedIndependent
' flush queues
myJobManager.UserQueueFlush()
myJobManager.FailureQueueFlush()
myJob.ImageQueueFlush()
myIndependentJob.RealTimeQueueFlush()
End Sub
Delegate Sub myJobmanagerDelegate(ByVal sender As Object, ByVal e As CogJobManagerActionEventArgs)
Private Sub CameraFrm_Closing(sender As Object, e As CancelEventArgs) Handles Me.Closing
'Shut down the CogJobManager to clean up threads properly
Timer1.Enabled = False
'If myJob.AcqFifo.FrameGrabber.Then Then
'Else
'End If
'myJob.AcqFifo.FrameGrabber.Disconnect(False)
myJobManager.Shutdown()
End Sub
Private Sub myJobManager_UserResultAvailable(sender As Object, e As CogJobManagerActionEventArgs) Handles myJobManager.UserResultAvailable
If InvokeRequired Then
Dim myDel As New myJobmanagerDelegate(AddressOf myJobManager_UserResultAvailable)
Dim eventargs() As Object = {sender, e}
Invoke(myDel, eventargs)
Return
End If
Dim topRecord As Cognex.VisionPro.ICogRecord = myJobManager.UserResult
'Populate status label with application information
outputinfo =
topRecord.SubRecords("UserResultTag").Content & ": " _
& topRecord.SubRecords("JobName").Content & " --> " _
& topRecord.SubRecords("RunStatus").Content.ToString
Dim tmpRecord As Cognex.VisionPro.ICogRecord
'Assume the required record Is present And get it
tmpRecord = topRecord.SubRecords("BlobArea")
Blob_Output_Area = tmpRecord.Content
'tmpRecord = topRecord.SubRecords("Picture")
' Assume that the required "image" record is present, and go get it.
tmpRecord = topRecord.SubRecords.Item("ShowLastRunRecordForUserQueue")
tmpRecord = tmpRecord.SubRecords.Item("LastRun")
tmpRecord = tmpRecord.SubRecords.Item("Image Source.OutputImage")
CogRecordDisplay1.Record = tmpRecord
CogRecordDisplay1.Fit(True)
'savefile = JobNo + "_" + Now.Hour.ToString + Now.Minute.ToString + Now.Second.ToString + ".BMP"
'If GetStrFromINI("CCD", "PictureSave", "", inifilepath) = "1" Then
'CogRecordDisplay1.Image.ToBitmap.Save(savepath + savefile)
' End If
ResultGot = True
End Sub
Private Sub Timer1_Tick_1(sender As Object, e As EventArgs) Handles Timer1.Tick
Try
If Jobworking = False Then
JobStart_f = GetStrFromINI("VisionPro", "JobStart", "", inifilepath)
If JobStart_f = "1" Then
Me.TopMost = False
Jobworking = True
WriteStrINI("VisionPro", "JobStart", "0", inifilepath)
JobNo = GetStrFromINI("VisionPro", "JobNo", "", inifilepath)
JobPath = GetStrFromINI("VisionPro_Job" & JobNo, "Path", "", inifilepath)
InitializeJobManager(JobPath)
myJobManager.Run()
End If
End If
Catch ex As Exception
MsgBox(ex.Message)
myJobManager.Stop()
Jobworking = False
End Try
Try
If ResultGot Then
ResultGot = False
WriteStrINI("VisionPro", "ResultVal", Blob_Output_Area.ToString, inifilepath)
WriteStrINI("VisionPro", "Result", "1", inifilepath)
myJobManager.Stop()
myJobManager.Shutdown()
'Me.TopMost = True
Jobworking = False
End If
Catch ex As Exception
ResultGot = False
Jobworking = False
WriteStrINI("VisionPro", "ResultVal", "99", inifilepath)
WriteStrINI("VisionPro", "Result", "1", inifilepath)
MsgBox(ex.Message)
End Try
End Sub
Private Sub JobClose()
CogRecordDisplay1.Dispose()
'Be sure to shudown the CogJobManager!!
myJobManager.Shutdown()
Jobworking = False
End Sub
End Class