回调函数使用方法
通常在方案或流程执行完成后,就可以获取到流程运行的结果.运行一次流程后,我们就可以获取到流程的渲染结果以及流程的数据结果.那么使用通讯或硬件进行外部触发时,如何获取结果呢?
这种时候就要用到回调函数.
1. 注释原获取结果代码
2. 注册回调函数
在构造函数中注册回调函数,所有流程在运行完成后,都会进入这个回调函数.
public Form1()
{
KillProcess("VisionMasterServerApp");
KillProcess("VisionMaster");
KillProcess("VmModuleProxy.exe");
InitializeComponent();
//注册回调函数,推荐回调函数获取结果.
VmSolution.OnWorkStatusEvent += VmSolution_OnWorkStatusEvent;
}
3. 回调函数获取结果
private void VmSolution_OnWorkStatusEvent(ImvsSdkDefine.IMVS_MODULE_WORK_STAUS workStatusInfo)
{
try
{
if (workStatusInfo.nWorkStatus==0 && workStatusInfo.nProcessID==10000)//为0表示执行完毕,为1表示正在执行,10000表示流程1
{
//通过流程获取结果,分为渲染结果和数据结果
VmProcedure vmProcedure = (VmProcedure)VmSolution.Instance["流程1"];
string ocrResult = vmProcedure.ModuResult.GetOutputString("out").astStringVal[0].strValue;
string ocrNum = vmProcedure.ModuResult.GetOutputInt("out0").pIntVal[0].ToString();
this.BeginInvoke(new Action(() => {//回调里对控件操作需要使用委托
vmRenderControl1.ModuleSource = vmProcedure;//渲染结果
listBox1.Items.Add("字符识别结果:" + ocrResult);
listBox1.TopIndex = listBox1.Items.Count - 1;
listBox1.Items.Add("个数:" + ocrNum);
listBox1.TopIndex = listBox1.Items.Count - 1;
}));
//也可以通过模块获取结果
IMVSOcrModuCs.IMVSOcrModuTool ocrModuTool = (IMVSOcrModuCs.IMVSOcrModuTool)VmSolution.Instance["流程1.字符识别1"];
string ocrScore1 = ocrModuTool.ModuResult.CharNum.ToString();
}
}
catch (VmException ex)
{
MessageBox.Show(ex.Message);
}
}
4. 运行程序
- 运行程序,加载方案
- 方案加载
- 方案执行
可以看到,对应的流程执行完成后,会进入回调函数,获取结果.图像渲染区和消息区也都显示了结果.