Пользуйтесь несколькими разделяемыми библиотеками в отдельном приложении

При разработке приложений, которые используют несколько MATLAB® разделяемые библиотеки, рассмотрите следующее:

  • Совместно использованная библиотека каждого MATLAB должна быть инициализирована отдельно.

  • Совместно использованная библиотека каждого MATLAB должна быть отключена отдельно.

  • Указатели функции MATLAB не могут быть совместно использованы разделяемыми библиотеками.

  • Указатели фигуры MATLAB не могут быть совместно использованы разделяемыми библиотеками.

  • Объекты MATLAB не могут быть совместно использованы разделяемыми библиотеками.

  • C, Java®, и объекты.NET не могут быть совместно использованы разделяемыми библиотеками.

  • Исполняемые данные, хранимые в массивах ячеек и структурах, не могут быть совместно использованы разделяемыми библиотеками

Инициализируйте и отключите несколько разделяемых библиотек

Инициализировать и отключить несколько разделяемых библиотек:

  1. Инициализируйте MATLAB Runtime с помощью mclmcrInitialize().

  2. Вызовите фрагмент приложения, которое выполняет код MATLAB с помощью mclRunMain().

  3. Прежде, чем инициализировать разделяемые библиотеки, инициализируйте состояние приложения MATLAB использование mclInitializeApplication().

  4. Поскольку каждый MATLAB совместно использовал библиотеку, вызовите сгенерированную функцию инициализации, libraryInitialize().

  5. Добавьте код для работы с кодом MATLAB.

  6. Поскольку каждый MATLAB совместно использовал библиотеку, высвободите средства, используемые библиотекой с помощью сгенерированной функции завершения, libraryTerminate().

  7. Высвободите средства, используемые MATLAB Runtime путем вызова mclTerminateApplication().

Этот пример показывает использование двух разделяемых библиотек.

 Код драйвера в качестве примера

Работа с указателями функции MATLAB

Указатель функции MATLAB может быть передан назад и вперед между экземпляром MATLAB Runtime и приложением. Однако это не может быть передано от одного экземпляра MATLAB Runtime до другого. Например, предположите, что у вас было две функции MATLAB, get_plot_handle и plot_xy, и plot_xy используемый указатель на функцию создается get_plot_handle.

% Saved as get_plot_handle.m
function h = get_plot_handle(lnSpec, lnWidth, mkEdge, mkFace, mkSize)
h = @draw_plot;
    function draw_plot(x, y)
        plot(x, y, lnSpec, ...
            'LineWidth', lnWidth, ...
            'MarkerEdgeColor', mkEdge, ...
            'MarkerFaceColor', mkFace, ...
            'MarkerSize', mkSize)
    end
end
% Saved as plot_xy.m
function plot_xy(x, y, h)
h(x, y);
end

Если вы упаковали их в две отдельных разделяемых библиотеки, вызов plot_xy выдал бы исключение.

 Код драйвера в качестве примера

Один способ обработать ситуацию состоит в том, чтобы группировать обе функции в одну разделяемую библиотеку. Например, если вы вызвали разделяемую библиотеку plot_functions, для вашего приложения был бы только нужен один вызов, чтобы инициализировать функцию, и вы могли передать указатель на функцию для plot_xy без ошибки.

 Код драйвера в качестве примера

Работа с объектами

MATLAB Compiler SDK™ позволяет вам возвратить следующие типы объектов от MATLAB Runtime до вашего кода приложения:

  • MATLAB

  • C++

  • .NET

  • Java

  • Python®

Однако вы не можете передать объект, созданный в одном экземпляре MATLAB Runtime в различный экземпляр MATLAB Runtime. Этот конфликт может произойти, когда функция, которая возвращает объект и функцию, которая управляет тем объектом, упакована в различные разделяемые библиотеки.

Например, скажите, что вы разрабатываете две функции. Первое создает банковский счет для клиента. Вторые фонды передач между двумя учетными записями.

% Saved as account.m
classdef account < handle

    properties
        name
    end
    
    properties (SetAccess = protected)
        balance = 0
        number
    end
    
    methods
        function obj = account(name)
            obj.name = name;
            obj.number = round(rand * 1000);
        end
        
        function deposit(obj, deposit)
            new_bal = obj.balance + deposit;
            obj.balance = new_bal;
        end
        
        function withdraw(obj, withdrawl)
            new_bal = obj.balance - withdrawl;
            obj.balance = new_bal;
        end
        
    end
end
% Saved as open_acct .m
function acct = open_acct(name, open_bal )

    acct = account(name);

    if open_bal > 0
        acct.deposit(open_bal);
    end
    
end
% Saved as transfer.m
function transfer(source, dest, amount)

    if (source.balance > amount)
        dest.deposit(amount);
        source.withdraw(amount);
    end

end

Если вы упаковали open_acct.m и transfer.m в отдельные разделяемые библиотеки вы не могли передать фонды с помощью учетных записей, созданных с open_acct. Вызов transfer выдал бы исключение. Один способ разрешить это состоит в том, чтобы группировать обе функции в одну разделяемую библиотеку. Вы могли также осуществить рефакторинг приложение, чтобы не передать объекты MATLAB функциям.

Похожие темы