主要内容

调用MATLAB从分离线程在MEX函数

MEX函数可以调用MATLAB®从用户创建的线程使用c++引擎异步API。

在单独的线程上异步调用MATLAB不会阻塞MATLAB的执行。在用户线程继续执行时,MEX函数可以返回到MATLAB提示符。您可以通过引擎异步API或命令提示符从用户线程调用MATLAB函数。MATLAB将来自每个线程的命令排成队列,并按照接收到的顺序执行它们。

沟通MATLAB来自Separate Threads

要从用户创建的线程调用MATLAB,定义一个使用以下技术的MEX函数:

  • 为异步函数调用启动一个执行线程,例如c++ 11std::异步函数。

  • 使用c++引擎API对MATLAB进行异步调用。

更新文本显示的示例

这个MEX函数在MATLAB图形窗口中显示当前日期和时间。日期/时间字符串每秒更新一次。的调用所创建的线程继续异步更新时,MEX函数返回到MATLAB提示符std::异步

dateTimeWindow.m函数(MATLAB代码)创建一个图形窗口和一个uicontrol文本对象显示日期和时间。的标签uicontrol的属性和图形包含用于从MEX函数访问这些对象的标识符。

函数dateTimeWindow window = figure(菜单条的“没有”“工具栏”“没有”“名字”“当前日期和时间”“NumberTitle”“关闭”“单位”“归一化”“位置”,(。01 .01 .25 .05],“标签”“mexDateTimeHandle”“HandleVisibility”“关闭”);uicontrol (“父”windowHandle,“风格”“文本”“标签”“date_time”“字符串”datestr(现在)“单位”“归一化”“位置”,[0 0 1 1],“字形大小”、28);结束

这个MEX函数定义DisplayDateTime ()函数执行这些操作:

  • 调用dateTimeWindow.mMATLAB函数设置图形窗口和文字显示。

  • 通过分配表达式的输出,每秒更新一次日期和时间的显示datestr(现在)到uicontrol字符串财产。

  • 测试uicontrol对象的有效性,以确定图形窗口是否已关闭。

  • 如果窗口和文本对象不再存在,则退出更新循环。

MEX函数调用std::异步运行DisplayDateTime ()单独线程上的成员函数。

/*使用异步引擎API显示日期-时间字符串*调用MATLAB dateTimeWindowM函数创建figure *和uicontrol对象。每秒更新一次日期和时间。在单独的线程*/上异步运行#include "mex.hpp" #include "mexAdapter.hpp" #include <线程> #include <未来>类MexFunction: public matlab::mex::Function {private: std::future voidStdFuture;std::shared_ptr matlabPtr = getEngine();bool isRunning = false;public: void DisplayDateTime() {matlab::data::ArrayFactory工厂;matlabPtr - > evalAsync (u“dateTimeWindow;”);while (isRunning) {matlabPtr->evalAsync(u"set(findall(0,'Tag','date_time'), 'String',datestr(now));");std::vector args({factory.createScalar(0), factory.createCharArray("Tag"), factory.createCharArray("date_time"),});matlab::引擎::FutureResult < matlab::数据::数组> fresult;fresult = matlabPtr->fevalAsync(u"findall", args);matlab::data::Array result = 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关闭

另请参阅

||

相关的话题