Mil学习之Mapp
Posted Thomas会写字
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Mil学习之Mapp相关的知识,希望对你有一定的参考价值。
一、什么是Mapp
以Mapp为前缀的函数构成了应用程序模块。应用程序模块允许您初始化和控制MIL应用程序的执行环境。除其他外,该模块还提供集成调试服务、用于基准测试的高性能计时器、可移植线程和事件处理,以及用于处理和内存操作的自动系统资源补偿。
二、Mapp常用功能
1. 初始化Mil环境
每个Mil程序开始的第一步。
- 使用 MappAlloc 和 MappFree
C++写法1。
MIL_ID MilApplication = M_NULL;
MappAlloc(M_NULL, M_DEFAULT, &MilApplication);
...
MappFree(MilApplication);
C++写法2,可以注意到新版Mil中的写法2是不需要释放的,这是新版Mil的特性,不过我没测试过。
MIL_UNIQUE_APP_ID MilApplication = MappAlloc(M_NULL, M_DEFAULT, M_UNIQUE_ID);
C#写法
MIL_ID MilApplication = MIL.M_NULL;
MIL.MappAlloc(MIL.M_NULL, MIL.M_DEFAULT, ref MilApplication);
...
MIL.MappFree(MilApplication);
- 使用 MappAllocDefault 和 MappAllocDefault
这样写的方便之处是可以一次性初始化多个对象,包括app、sys、disp等等,需要注意这里的默认设置是和 MilConfig 里面是对应的。
C++。
MIL_ID MilApplication, MilSystem, MilDisplay;
MappAllocDefault(M_DEFAULT, &MilApplication, &MilSystem, M_NULL,M_NULL, M_NULL);
...
MappFreeDefault(MilApplication, MilSystem, M_NULL, M_NULL, M_NULL);
C# 写法套路同上。
2. 计时
统计功能,Mil的计时可以使用该函数,也可以使用Mil自己的调试工具,调试工具的使用在后面会介绍。
C++。
MIL_DOUBLE Time = 0.0;
MappTimer(M_DEFAULT, M_TIMER_RESET+M_SYNCHRONOUS, M_NULL);
...
MappTimer(M_DEFAULT, M_TIMER_READ+M_SYNCHRONOUS, &Time);
3. 异常处理
通常来说是用不到这个的。。。
打开和关闭 Mil 异常提示
MappControl(M_DEFAULT, M_ERROR, M_PRINT_DISABLE);
...
MappControl(M_DEFAULT, M_ERROR, M_PRINT_ENABLE);
使用 try...catch捕获 Mil 异常,注意这个只在C# 开发环境下有效
MIL.MappControl(MilApp, MIL.M_ERROR, MIL.M_THROW_EXCEPTION);
try
{
// 如果这里的Mil函数执行报错,会在 catch 中捕获到
}
catch (MILException exception)
{
Console.WriteLine("System Allocation Error : {0}", exception.Message);
MessageBox.Show(exception.Message, "System Allocation Error", MessageBoxButton.OK, MessageBoxImage.Error);
}
4. 回调
处理Mil报错时会使用到。
C++.
MappHookFunction(M_DEFAULT, M_ERROR_CURRENT,HookFunction,this);
...
MappHookFunction(M_DEFAULT, M_ERROR_CURRENT+M_UNHOOK,HookFunction,this);
MIL_INT MFTYPE HookFunction(MIL_INT HookType, MIL_ID EventId, void* UserDataPtr)
{
MIL_TEXT_CHAR ErrorMessage[M_ERROR_MESSAGE_SIZE] = MIL_TEXT("");
MappGetHookInfo(M_DEFAULT, EventId,M_MESSAGE+M_CURRENT_FCT,ErrorMessage);
return M_NULL;
}
C#
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.IO;
using System.Runtime.InteropServices;
using Matrox.MatroxImagingLibrary;
namespace ConsoleApplication1
{
class Program
{
struct UserDataStruct
{
double dVal;
}
public static MIL_APP_HOOK_FUNCTION_PTR HookFunctionDelegate = new MIL_APP_HOOK_FUNCTION_PTR(HookFunction);
static void Main(string[] args)
{
MIL_ID milapp = 0, milsys = 0, mildisp = 0;
MIL.MappAllocDefault(MIL.M_DEFAULT, ref milapp, ref milsys, ref mildisp, MIL.M_NULL, MIL.M_NULL);
UserDataStruct userData = new UserDataStruct();
GCHandle hData = GCHandle.Alloc(userData);
IntPtr ptrData = GCHandle.ToIntPtr(hData);
MIL.MappHookFunction(MIL.M_DEFAULT, MIL.M_ERROR_CURRENT, HookFunctionDelegate, ptrData);
// ...
MIL.MappHookFunction(MIL.M_DEFAULT, MIL.M_ERROR_CURRENT + MIL.M_UNHOOK, HookFunctionDelegate, ptrData);
MIL.MappFreeDefault(milapp, milsys, mildisp, MIL.M_NULL, MIL.M_NULL);
}
private static MIL_INT HookFunction(MIL_INT HookType, MIL_ID EventId, IntPtr UserDataPtr)
{
StringBuilder strBuild = new StringBuilder();
MIL.MappGetHookInfo(MIL.M_DEFAULT, EventId, MIL.M_MESSAGE + MIL.M_CURRENT_FCT, strBuild);
// ...
return 0;
}
}
}
5. 查询 Inquire
顾名思义,查询Mapp所有的属性设置,使用很简单,详细使用参加Mil帮助文档吧~
以上是关于Mil学习之Mapp的主要内容,如果未能解决你的问题,请参考以下文章