MEX函数可以调用MATLAB®从使用C ++引擎异步API用户创建的线程。
异步调用作出MATLAB在单独的线程不会阻止MATLAB执行。该MEX函数可以返回到MATLAB提示,同时执行用户线程继续。您可以通过发动机异步API或在命令提示符下调用从用户线程MATLAB功能。MATLAB从每个线程队列中的命令,并按照接收顺序执行它们。
要从用户创建的线程调用matlab,请定义使用这些技术的MEX函数:
启动异步函数调用的执行线程,例如使用C ++ 11的std ::异步
功能。
使用C ++引擎API,使MATLAB的异步调用。
此MEX功能显示MATLAB图形窗口中的当前日期和时间。日期/时间字符串每秒更新。MEX函数返回到MATLAB提示符,而异步更新继续呼叫创建的线程的std ::异步
。
当datetimewindow.m.
函数(MATLAB代码)创建的图形窗口和uicontrol
文本对象以显示日期和时间。当标签
的uicontrol和该图的属性包含用于从MEX函数访问这些对象标识符。
功能dateTimeWindow windowHandle =系数('菜单栏'那'无'那......“工具栏”那'无'那......'姓名'那“当前日期和时间”那......'NumberTitle'那'离开'那......'单位'那“规范化”那......'位置',[。01 .01 .25 .05],......'标签'那'mexdatetimehandle'那......'HandleVisibility'那'离开');UICONTROL('父母',windowhandle,......'风格'那'文本'那......'标签'那'约会时间'那......'字符串',datestr(现在),......'单位'那“规范化”那......'位置',[0 0 1 1],......'字体大小',28);结束
此MEX功能定义了displaydatetime()
函数来执行这些操作:
打电话给datetimewindow.m.
MATLAB函数来设置数字窗口和文本显示。
通过分配表达式的输出来更新的日期和时间每秒一次的显示datestr(现在)
到uicontrol串
财产。
测试UIControl对象的有效性,以确定图窗口是否已关闭。
如果窗口和文本对象不再存在,则退出更新循环。
MEX函数调用的std ::异步
运行displaydatetime()
成员函数在单独的线程上。
/ *使用异步引擎API来显示时间串*调用MATLAB dateTimeWindow.m函数来创建人物*和uicontrol对象。更新每秒一次*的日期和时间。在一个单独的线程异步运行* /的#include “mex.hpp” 的#include “mexAdapter.hpp” 的#include <线程>的#include <未来>类MexFunction:公共MATLAB :: MEX ::功能{私人:性病::将来<空隙> voidStdFuture;的std :: shared_ptr的matlabPtr = getEngine();布尔isRunning = FALSE;公共:无效DisplayDateTime(){MATLAB ::数据:: ArrayFactory工厂;matlabPtr-> evalAsync(U “dateTimeWindow;”);而(isRunning){matlabPtr-> evalAsync(u “的组(的findall(0, '标签', 'DATE_TIME'), '字符串',datestr(现在));”);的std ::矢量 ARGS({factory.createScalar <双>(0),factory.createCharArray( “标记”),factory.createCharArray( “DATE_TIME”),});MATLAB ::发动机::使用FutureResult fresult;fresult = matlabPtr-> fevalAsync(U “的FindAll”,参数);matlab的::数据::阵列结果= fresult.get(); isRunning = !result.isEmpty(); if (!isRunning) { matlabPtr->evalAsync(u"mexDateTime close"); } std::this_thread::sleep_for(std::chrono::seconds(1)); } } void operator()(matlab::mex::ArgumentList outputs, matlab::mex::ArgumentList inputs) { if (inputs.size() == 0) { mexLock(); if(!isRunning) { isRunning = true; voidStdFuture = std::async(std::launch::async, &MexFunction::DisplayDateTime, this); } } else { isRunning = false; matlabPtr->eval(u"close(findall(0,'Tag','mexDateTimeHandle'))"); mexUnlock(); } } };
要使用保存为MEX功能mexDateTime.cpp
, 使用梅克斯
命令构建程序。
梅克斯-设置C ++梅克斯mexDateTime.cppmexDateTime
MEX函数锁定MEX文件以防止尝试在单独的线程仍处于活动状态时重新编译MEX函数。当您结束执行时,MEX函数解锁。
结束对所述单独的线程执行,关闭包含的日期和时间的文本图形窗口或调用函数MEX与输入参数。例如:
mexDateTime关闭
figure
|MATLAB :: MEX ::功能
|uicontrol