主要内容

打电话马铃薯从在MEX功能的单独的线程

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关闭

也可以看看

||

相关主题