Создайте клиент C++

Этот пример показывает, как записать клиенту MATLAB® Production Server™, использующему клиентский API C. Клиентское приложение вызывает функцию addmatrix, вы скомпилировали в Пакете Развертываемые Архивы с Приложением Production Server Compiler и развернули в Доле Развертываемый Архив на Экземпляре Сервера (MATLAB Production Server).

Создайте клиентское приложение MATLAB Production Server C++:

  1. Создайте файл под названием addmatrix_client.cpp.

  2. Используя текстовый редактор, откройте addmatrix_client.cpp.

  3. Добавьте, что следующее включает операторы в файл:

    #include <iostream>
    #include <mps/client.h>

    Примечание

    Заголовочные файлы для MATLAB Production Server C клиентский API расположены в папке matlabroot/toolbox/compiler_sdk/mps_client/c/include/mps. папка.

  4. Добавьте метод main() в приложение.

    int main ( void )
    {
    } 
  5. Инициализируйте клиентское время выполнения.

    mpsClientRuntime* mpsruntime = mpsInitializeEx(MPS_CLIENT_1_1);
  6. Создайте клиентскую настройку.

    mpsClientConfig* config;
    mpsStatus status = mpsruntime->createConfig(&config);
  7. Создайте клиентский контекст.

    mpsClientContext* context;
    status = mpsruntime->createContext(&context, config);
  8. Создайте данные MATLAB, чтобы ввести к функции.

    double a1[2][3] = {{1,2,3},{3,2,1}};
    double a2[2][3] = {{4,5,6},{6,5,4}};
    
    int numIn=2;
    mpsArray** inVal = new mpsArray* [numIn];
    
    inVal[0] = mpsCreateDoubleMatrix(2,3,mpsREAL);
    inVal[1] = mpsCreateDoubleMatrix(2,3,mpsREAL);
    
    double* data1 = (double *)( mpsGetData(inVal[0]) );
    double* data2 = (double *)( mpsGetData(inVal[1]) );
    
    for(int i=0; i<2; i++)
    {
      for(int j=0; j<3; j++)
      {
        mpsIndex subs[] = { i, j };
        mpsIndex id = mpsCalcSingleSubscript(inVal[0], 2, subs);
        data1[id] = a1[i][j];
        data2[id] = a2[i][j];
      }
    }
    
  9. Создайте данные MATLAB, чтобы содержать вывод.

    int numOut = 1;
    mpsArray **outVal = new mpsArray* [numOut];
  10. Вызовите развернутую функцию MATLAB.

    Задайте следующее в качестве аргументов:

    • клиентский контекст

    • URL функции

    • Количество ожидаемых выходных параметров

    • Указатель на mpsArray, содержащий выходные параметры

    • Количество входных параметров

    • Указатель на mpsArray, содержащий входные параметры

    mpsStatus status = mpsruntime->feval(context,
        "http://localhost:9910/addmatrix/addmatrix",
        numOut, outVal, numIn, (const mpsArray**)inVal);
    

    Для получения дополнительной информации о функции feval, смотрите ссылочный материал, включенный в папку matlabroot/toolbox/compiler_sdk/mps_client.

  11. Проверьте, что вызов функции был успешным использованием оператора if.

    if (status==MPS_OK)
    {
    }
    
  12. В операторе if добавьте код, чтобы обработать вывод.

    double* out = mpsGetPr(outVal[0]);
    
    for (int i=0; i<2; i++)
    {
      for (int j=0; j<3; j++)
      {        
        mpsIndex subs[] = {i, j};
        mpsIndex id = mpsCalcSingleSubscript(outVal[0], 2, subs);
        std::cout << out[id] << "\t";
      }
      std::cout << std::endl;
    }
  13. Добавьте пункт else в оператор if, чтобы обработать любые ошибки.

    else  
    {
      mpsErrorInfo error;
      mpsruntime->getLastErrorInfo(context, &error);
      std::cout << "Error: " << error.message << std::endl;
      switch(error.type)
      {
        case MPS_HTTP_ERROR_INFO:
          std::cout << "HTTP: " << error.details.http.responseCode << ": " 
              << error.details.http.responseMessage << std::endl;
        case MPS_MATLAB_ERROR_INFO:
          std::cout << "MATLAB: " << error.details.matlab.identifier 
              << std::endl;
          std::cout << error.details.matlab.message << std::endl;
        case MPS_GENERIC_ERROR_INFO:
          std::cout << "Generic: " << error.details.general.genericErrorMsg 
              << std::endl;
      }
    
      mpsruntime->destroyLastErrorInfo(&error);
    }
  14. Освободите память, используемую входными параметрами.

    for (int i=0; i<numIn; i++)
      mpsDestroyArray(inVal[i]);
    delete[] inVal;
    
  15. Освободите память, используемую выходными параметрами.

    for (int i=0; i<numOut; i++)
      mpsDestroyArray(outVal[i]);
    delete[] outVal;
    
  16. Освободите память, используемую клиентским временем выполнения.

    mpsruntime->destroyConfig(config);
    mpsruntime->destroyContext(context);
    mpsTerminate();
    
  17. Сохраните файл.

    Завершенная программа должна напомнить следующее:

    #include <iostream>
    #include <mps/client.h>
    
    int main ( void )
    {
      mpsClientRuntime* mpsruntime = mpsInitializeEx(MPS_CLIENT_1_1);
    
      mpsClientConfig* config;
      mpsStatus status = mpsruntime->createConfig(&config);
    
      mpsClientContext* context;
      status = mpsruntime->createContext(&context, config);
    
      double a1[2][3] = {{1,2,3},{3,2,1}};
      double a2[2][3] = {{4,5,6},{6,5,4}};
    
      int numIn=2;
      mpsArray** inVal = new mpsArray* [numIn];
      inVal[0] = mpsCreateDoubleMatrix(2,3,mpsREAL);
      inVal[1] = mpsCreateDoubleMatrix(2,3,mpsREAL);
      double* data1 = (double *)( mpsGetData(inVal[0]) );
      double* data2 = (double *)( mpsGetData(inVal[1]) );
      for(int i=0; i<2; i++)
      {
        for(int j=0; j<3; j++)
        {
          mpsIndex subs[] = { i, j };
          mpsIndex id = mpsCalcSingleSubscript(inVal[0], 2, subs);
          data1[id] = a1[i][j];
          data2[id] = a2[i][j];
        }
      }
    
      int numOut = 1;
      mpsArray **outVal = new mpsArray* [numOut];
    
      status = mpsruntime->feval(context,
                   "http://localhost:9910/addmatrix/addmatrix",
                   numOut, outVal, numIn, (const mpsArray **)inVal);
    
      if (status==MPS_OK)
      {
        double* out = mpsGetPr(outVal[0]);
    
        for (int i=0; i<2; i++)
        {
          for (int j=0; j<3; j++)
          {
            mpsIndex subs[] = {i, j};
            mpsIndex id = mpsCalcSingleSubscript(outVal[0], 2, subs);
            std::cout << out[id] << "\t";
          }
          std::cout << std::endl;
        }
      }
      else
      {
        mpsErrorInfo error;
        mpsruntime->getLastErrorInfo(context, &error);
        std::cout << "Error: " << error.message << std::endl;
    
        switch(error.type)
        {
        case MPS_HTTP_ERROR_INFO:
          std::cout << "HTTP: " 
              << error.details.http.responseCode 
              << ": " << error.details.http.responseMessage
              << std::endl;
        case MPS_MATLAB_ERROR_INFO:
          std::cout << "MATLAB: " << error.details.matlab.identifier 
              << std::endl;
          std::cout << error.details.matlab.message << std::endl;
        case MPS_GENERIC_ERROR_INFO:
          std::cout << "Generic: " 
              << error.details.general.genericErrorMsg 
              << std::endl;
        }
        mpsruntime->destroyLastErrorInfo(&error);
      }
    
      for (int i=0; i<numIn; i++)
        mpsDestroyArray(inVal[i]);
      delete[] inVal;
    
      for (int i=0; i<numOut; i++)
        mpsDestroyArray(outVal[i]);
      delete[] outVal;
    
      mpsruntime->destroyConfig(config);
      mpsruntime->destroyContext(context);
      mpsTerminate();
    }
  18. Скомпилируйте приложение.

    Чтобы скомпилировать ваш клиентский код, для компилятора нужен доступ к client.h. Этот заголовочный файл хранится в matlabroot/toolbox/compiler_sdk/mps_client/c/include/mps/.

    Чтобы соединить ваше приложение, компоновщику нужен доступ к следующим файлам, хранившим в matlabroot/toolbox/compiler_sdk/mps_client/c/:

    Файлы, необходимые для соединения

    Windows® UNIX®/Linux Mac OS X
    $arch\lib\mpsclient.lib $arch/lib/libprotobuf.so $arch/lib/libprotobuf.dylib
     $arch/lib/libcurl.so $arch/lib/libcurl.dylib
     $arch/lib/libmwmpsclient.so $arch/lib/libmwmpsclient.dylib
     $arch/lib/libmwcpp11compat.so  
  19. Запустите приложение.

    Чтобы запустить ваше приложение, добавьте следующие файлы, хранившие в matlabroot/toolbox/compiler_sdk/mps_client/c/ к пути приложения:

    Файлы, необходимые для выполнения

    Windows UNIX/Linux Mac OS X
    $arch\lib\mpsclient.dll$arch/lib/libprotobuf.so $arch/lib/libprotobuf.dylib
    $arch\lib\libprotobuf.dll$arch/lib/libcurl.so $arch/lib/libcurl.dylib
    $arch\lib\libcurl.dll$arch/lib/libmwmpsclient.so $arch/lib/libmwmpsclient.dylib
     $arch/lib/libmwcpp11compat.so  

    Клиент вызывает функцию addmatrix на экземпляр сервера и возвращает следующую матрицу в консоли:

    5.0 7.0 9.0
    9.0 7.0 5.0