大家好,欢迎来到IT知识分享网。
一、什么是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帮助文档吧~
6. 文件操作
1) 查看一个文件夹下有多少指定类型文件,以及获取文件名,文件名长度
// 获取文件夹下文件个数 MIL_STRING FileToSearch = MIL_TEXT("D\\SubFoder\\*.bmp"); MIL_INT NumberOfFiles = 0; MappFileOperation(MilApplication, FileToSearch, M_NULL, M_NULL, M_FILE_NAME_FIND_COUNT, M_DEFAULT, &NumberOfFiles); for(int i=0; i<NumberOfFiles ; i++) { // 获取文件名的长度,含最后'\0' MIL_INT FilenameStrSize = 0; MappFileOperation(MilApplication, FileToSearch, M_NULL, M_NULL, M_FILE_NAME_FIND + M_STRING_SIZE, i, &FilenameStrSize); // 获取文件名 1 std::vector<MIL_TEXT_CHAR> vFilename; vFilename.resize(FilenameStrSize); MappFileOperation(MilApplication, FileToSearch, M_NULL, M_NULL, M_FILE_NAME_FIND, i, &vFilename[0]); // 获取文件名 2 MIL_STRING FileName = MIL_TEXT(""); MappFileOperation(MilApplication, FileToSearch, M_NULL, M_NULL, M_FILE_NAME_FIND, i, FileName); }
// 获取文件夹下文件个数 MIL_INT NumberOfFiles = 0; String FileToSearch = @"D:\壁纸\*.jpg"; MIL.MappFileOperation(MilApp, FileToSearch, MIL.M_NULL, MIL.M_NULL, MIL.M_FILE_NAME_FIND_COUNT, MIL.M_DEFAULT, ref NumberOfFiles); for (int i = 0; i < NumberOfFiles; i++) { MIL_INT FilenameStrSize = 0;// 获取文件名的长度,含最后'\0' MIL.MappFileOperation(MilApp, FileToSearch, MIL.M_NULL, MIL.M_NULL, MIL.M_FILE_NAME_FIND + MIL.M_STRING_SIZE, i, ref FilenameStrSize); FilenameStrSize--; // 去掉末尾\0 String sName = ""; Char[] cName = new Char[FilenameStrSize]; IntPtr ptr = Marshal.StringToHGlobalAnsi(sName); MIL.MappFileOperation(MilApp, FileToSearch, MIL.M_NULL, MIL.M_NULL, MIL.M_FILE_NAME_FIND, i, ptr); Marshal.Copy(ptr, cName, 0, (int)FilenameStrSize); sName = new String(cName); }
2) 文件夹的创建和删除
MIL_INT FileExists; MappFileOperation(M_DEFAULT, ExampleDataPath, M_NULL, M_NULL, M_FILE_EXISTS, M_DEFAULT, &FileExists); // 文件夹是否存在 FileExists = M_YES MappFileOperation(M_DEFAULT, ExampleDataPath, M_NULL, M_NULL, M_FILE_MAKE_DIR, M_DEFAULT, M_NULL); // 创建文件夹 MappFileOperation(M_DEFAULT, ExampleDataPath, M_NULL, M_NULL, M_FILE_DELETE_DIR, M_DEFAULT, M_NULL); // 如果文件夹不为空,则删除文件夹 MappFileOperation(M_DEFAULT, ExampleDataPath, M_NULL, M_NULL, M_FILE_DELETE_DIR, M_RECURSIVE, M_NULL); // 无论文件夹是否为空,删除文件夹及文件夹内所有东西
3) 文件操作
MIL_INT FileExists = 0; MappFileOperation(M_DEFAULT, MIL_TEXT("D:\\SubFoder\\1.bmp"), M_NULL, M_NULL, M_FILE_EXISTS, M_DEFAULT, &FileExists); // 是否存在 FileExists = M_YES MappFileOperation(M_DEFAULT, MIL_TEXT("D:\\SubFoder\\1.bmp"), M_NULL, M_NULL, M_FILE_DELETE, M_DEFAULT, M_NULL); // 删除 MappFileOperation(M_DEFAULT, SrcFileName, M_DEFAULT, DetFileName, M_FILE_COPY, M_DEFAULT, M_NULL); // 文件复制,复制后文件可以和原文件不同名
免责声明:本站所有文章内容,图片,视频等均是来源于用户投稿和互联网及文摘转载整编而成,不代表本站观点,不承担相关法律责任。其著作权各归其原作者或其出版社所有。如发现本站有涉嫌抄袭侵权/违法违规的内容,侵犯到您的权益,请在线联系站长,一经查实,本站将立刻删除。 本文来自网络,若有侵权,请联系删除,如若转载,请注明出处:https://haidsoft.com/132701.html