CMatlabEngine.h // MatlabEngine.h: interface for the CMatlabEngine class. // ////////////////////////////////////////////////////////////////////// #if !defined(AFX_MATLABENGINE_H__AC7B9B82_D073_47D6_BE3D_4AF42B6528AD__INCLUDED_) #define AFX_MATLABENGINE_H__AC7B9B82_D073_47D6_BE3D_4AF42B6528AD__INCLUDED_ #if _MSC_VER > 1000 #pragma once #endif // _MSC_VER > 1000 #include <engine.h> #include "mxWrap.h" #define MAX_OUT_PUT 20000 typedef mxArray MatlabData; class GobalMatlabEngine; #ifdef SYS_DLL class _declspec(dllexport) CMatlabEngine #else class CMatlabEngine #endif { friend GobalMatlabEngine; public: CMatlabEngine(bool bSingleUse=0); virtual ~CMatlabEngine(); bool IsEngineOpen(); bool IsSingleUse(); bool OpenEngine(); bool CloseEngine(); void SetEngineVisible(bool bVisible); bool GetEngineVisible(); void PutVar(char *name,MatlabData* d); bool GetVar(char *name,MatlabData** d); bool GetVar(char *name,mxWrap* d); //执行命令 void EvalString(char* matlabString); const char* GetOutPut(); protected: // CEvent *m_signleUseEvent; Engine *m_matlabEng; int m_bInit; char m_OutBuffer[MAX_OUT_PUT];//局部matlab输出 static char g_OutBuffer[MAX_OUT_PUT];//全局malab输出 int m_bSingleUse;//是否独立开启一个matlab线程,否则将共享一个MATLAB线程。 }; #endif // !defined(AFX_MATLABENGINE_H__AC7B9B82_D073_47D6_BE3D_4AF42B6528AD__INCLUDED_) CMatlabEngine.cpp // MatlabEngine.cpp: implementation of the CMatlabEngine class. // ////////////////////////////////////////////////////////////////////// #include "MatlabEngine.h" ////////////////////////////////////////////////////////////////////// // Construction/Destruction ////////////////////////////////////////////////////////////////////// #pragma comment( lib, "libeng.lib" ) #pragma comment( lib, "libemlrt.lib" ) #pragma comment( lib, "libmat.lib" ) #pragma comment( lib, "libmex.lib" ) #pragma comment( lib, "libmx.lib" ) #pragma comment( lib, "mclmcr.lib" ) char CMatlabEngine::g_OutBuffer[MAX_OUT_PUT]; CMatlabEngine::CMatlabEngine(bool bSingleUse) { //需要手动控制 // m_signleUseEvent = new CEvent(0,1); m_matlabEng = 0;; m_bInit = 0; // m_signleUseEvent->SetEvent(); m_bSingleUse = bSingleUse; } CMatlabEngine::~CMatlabEngine() { // delete m_signleUseEvent; if(m_matlabEng) engClose(m_matlabEng); } bool CMatlabEngine::OpenEngine() { // WaitForSingleObject(m_signleUseEvent->m_hObject,-1); try { int s; if(m_matlabEng) CloseEngine(); if(m_bSingleUse) m_matlabEng = engOpenSingleUse(NULL,NULL,&s);// else m_matlabEng = engOpen(0); } catch (...) { } m_bInit = m_matlabEng!=0; if(m_bInit) { if(m_bSingleUse) engOutputBuffer(m_matlabEng,m_OutBuffer,MAX_OUT_PUT); else engOutputBuffer(m_matlabEng,g_OutBuffer,MAX_OUT_PUT); } // m_signleUseEvent->SetEvent(); return m_matlabEng!=0; } bool CMatlabEngine::IsEngineOpen() { return m_bInit; } bool CMatlabEngine::IsSingleUse() { return m_bSingleUse; } bool CMatlabEngine::CloseEngine() { // WaitForSingleObject(m_signleUseEvent->m_hObject,-1); if(m_matlabEng) { // EvalString("exit;"); engClose(m_matlabEng); m_matlabEng=0; m_bInit=0; } // m_signleUseEvent->SetEvent(); return 1; } void CMatlabEngine::SetEngineVisible(bool bVisible) { // WaitForSingleObject(m_signleUseEvent->m_hObject,-1); if(m_bInit) { engSetVisible(m_matlabEng,bVisible); } // m_signleUseEvent->SetEvent(); } const char* CMatlabEngine::GetOutPut() { if(m_bSingleUse) return m_OutBuffer; else return g_OutBuffer; } bool CMatlabEngine::GetEngineVisible() { // WaitForSingleObject(m_signleUseEvent->m_hObject,-1); if(m_bInit) { bool v; engGetVisible(m_matlabEng,&v); return v; } // m_signleUseEvent->SetEvent(); return 0; } void CMatlabEngine::PutVar(char *name,MatlabData* d) { // WaitForSingleObject(m_signleUseEvent->m_hObject,-1); if(m_bInit) engPutVariable(m_matlabEng,name,d); // m_signleUseEvent->SetEvent(); } bool CMatlabEngine::GetVar(char *name,MatlabData** d) { // WaitForSingleObject(m_signleUseEvent->m_hObject,-1); if(m_bInit) *d=engGetVariable(m_matlabEng,name); // m_signleUseEvent->SetEvent(); return d!=0; } bool CMatlabEngine::GetVar(char *name,mxWrap* d) { mxArray*ptr; bool v=GetVar(name,&ptr); d->SetArray(ptr); return v; } void CMatlabEngine::EvalString(char* matlabString) { // WaitForSingleObject(m_signleUseEvent->m_hObject,-1); if(m_bInit) { engEvalString(m_matlabEng,matlabString); } // m_signleUseEvent->SetEvent(); }