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的主要内容,如果未能解决你的问题,请参考以下文章

Mil学习之Mim的简单操作

Mil学习之显示鼠标交互交互绘图交互Mask

Mil学习之Mim的简单操作

Mil学习之Mim的简单操作

Mil学习之 MimLocateEvent 获取特定属性的像素坐标

Mil学习之 MimStatCalculate 图片信息统计