我正在使用Halcon (http://www.halcon.com/),并将其转换为C#,并在2013年的visual中使用。现在,我点击btnLive,给我相机现场,当我点击btnLiveStop得到我的错误。我怎么能阻止摄像机?我应该用线吗?或者..。
这是Live.cs:
using System;
using HalconDotNet;
public partial class LiveExport
{
public HTuple hv_ExpDefaultWinHandle;
Int32 Flag = 0;
// Main procedure
public void actionLive()
{
// Local iconic variables
HObject ho_Image=null;
// Local control variables
HTuple hv_AcqHandle = null;
// Initialize local and output iconic variables
HOperatorSet.GenEmptyObj(out ho_Image);
HOperatorSet.CloseAllFramegrabbers();
//Image Acquisition 01: Code generated by Image Acquisition 01
HOperatorSet.OpenFramegrabber("DirectShow", 1, 1, 0, 0, 0, 0, "default", 8, "rgb",
-1, "false", "default", "[0] DFx 72BUC02", 0, -1, out hv_AcqHandle);
HOperatorSet.GrabImageStart(hv_AcqHandle, -1);
while ((int)(1) != Flag)
{
ho_Image.Dispose();
HOperatorSet.GrabImageAsync(out ho_Image, hv_AcqHandle, -1);
HOperatorSet.DispObj(ho_Image, hv_ExpDefaultWinHandle);
//Image Acquisition 01: Do something
}
HOperatorSet.CloseFramegrabber(hv_AcqHandle);
ho_Image.Dispose();
}
public void InitHalconLive()
{
// Default settings used in HDevelop
HOperatorSet.SetSystem("width", 512);
HOperatorSet.SetSystem("height", 512);
}
public void RunHalconLive(HTuple Window)
{
hv_ExpDefaultWinHandle = Window;
//actionLive();
}
public void StopStart(Int32 value) {
this.Flag = value;
actionLive();
}
}在form.cs中,我编写了这些代码,但是当我单击btnStop时,不要工作,并显示没有响应(请帮助我):
private void btnLive_Click(object sender, EventArgs e)
{
HTuple WindowID = hWindowControl2.HalconID;
LVDEV = new LiveExport();
LVDEV.InitHalconLive();
LVDEV.RunHalconLive(WindowID);
LVDEV.actionLive();
}
private void btnLiveStop_Click(object sender, EventArgs e)
{
LiveExport LVDEVs = new LiveExport();
LVDEVs.StopStart(1);
}发布于 2016-06-07 01:03:33
这里有几件事需要解决。首先,“停止”图像抓取的方式是用"SetFramegrabberParam“调用运算符"do_abort_grab":
private void StopAcquisition(HTuple hv_AcqHandle)
{
HOperatorSet.SetFramegrabberParam(hv_AcqHandle, "do_abort_grab",1);
}此操作对应于StartImageGrab操作。
尽管如此,要做到这一点,您还需要对体系结构进行更多的更改。除非您显式地需要连接和断开相机,否则应该只调用OpenFrameGrabber一次,并将变量hv_acqHandle持久化,并提取CloseFramegrabber运算符。
然后,start和stop应该在另一个线程中调用不同的while循环:
private CancellationTokenSource StartAcquire(HTuple hv_acqHandle)
{
var tokenSource = new CancellationTokenSource();
Task.Run(()=>{
while(!tokenSource.Token.IsCancellationRequested)
{
ho_Image.Dispose();
HOperatorSet.GrabImageAsync(out ho_Image, hv_AcqHandle, -1);
HOperatorSet.DispObj(ho_Image, hv_ExpDefaultWinHandle);
}, tokenSource.Token);
return tokenSource;
}
public void StopContinuousAcquisition(HTuple hv_acqHandle, CancellationTokenSource tokenSource)
{
if (tokenSource== null)
return;
tokenSource.Cancel();
HOperatorSet.SetFramegrabberParam(_frameGrabber, "do_abort_grab", 1);
}表单锁定的原因是您的while(true)循环不允许任何事件注册。在这种情况下,您必须使用多线程方法。
https://stackoverflow.com/questions/33821760
复制相似问题