Вызов между несколькими экземплярами или потоками Matlab

По сути, мне нужен способ вызова функций Matlab из бесконечно длинного отдельного потока.

Во-первых, я знаю, что могу использовать функциональные возможности TCPIP или UDP для связи между двумя экземплярами Matlab. Я объясню, почему это не очень помогает.

Предыстория: я написал класс Matlab, который действует как интерфейс для USB-устройства. Matlab был выбран потому, что мне нужно, чтобы он работал на Mac/Linux/Windows, а целевые пользователи знакомы только с Matlab. Из-за некоторых несоответствий в Matlab на разных платформах я не использую BytesAvailableFcn или BytesAvailableFcnMode (мне нужно как можно ближе к реальному времени, а с вышеупомянутым могут быть задержки до 100 миллисекунд для отправки и получения данных), и вместо этого я отправка и опрос порта с фиксированным интервалом с использованием таймера. Это приводит к некоторым накладным расходам, и, если пользователь удерживает основной поток, отправка/получение также останавливается. Теперь одной из наиболее важных функций класса является установка обратных вызовов, основанных на входных данных, полученных от устройства. Пользователь устанавливает свою функцию и заданное условие для соответствия, и объект вызывает его автоматически.

Проблема: этот объект работает хорошо, полностью в фоновом режиме. Однако, как уже упоминалось, он потребляет некоторые ресурсы в потоке Matlab. Мне любопытно, как заставить работать только последовательную оболочку и функцию обратного вызова в своем собственном потоке. Однако, если я скомпилирую его как отдельное приложение (для всех трех платформ), я считаю, что моим единственным решением будет связь TCPIP/UDP. Что затем требует, чтобы объект, работающий в основном потоке, опрашивал порт, чтобы обрабатывать обратные вызовы в реальном времени, что сводит на нет преимущества перемещения его в автономное приложение.

Какие-либо предложения?


person Adam Jones    schedule 22.03.2018    source источник
comment
Вы можете написать инструмент на Java, работающий в своем собственном потоке, и управлять инструментом Java из MATLAB. MATLAB очень хорошо взаимодействует с Java, поскольку весь пользовательский интерфейс написан на Java.   -  person Cris Luengo    schedule 22.03.2018
comment
@CrisLuengo, мне было любопытно. Однако, учитывая 3 платформы, я предполагаю, что мне придется научиться взаимодействовать с оборудованием на Java, на что у меня может не хватить времени. Мне любопытно, возможно ли выполнить тяжелую работу и скомпилировать код Matlab для Java с помощью пакета Coder (?), А затем добавить функциональность для общения с Matlab (в основном, получать вызовы функций и вызывать функции времени выполнения).   -  person Adam Jones    schedule 22.03.2018


Ответы (1)


Потоки в Matlab - это кошмар. Делать что-либо в реальном времени с такими задержками, которые вы описываете, не рекомендуется. Под капотом Matlab использует Java для всей своей независимости от платформы. Если вы хотите сделать это правильно, вы напишете свое приложение изначально на Java и вызовете свою java из Matlab (чтобы справиться с тем фактом, что ваши пользователи не могут установить JRE, но могут установить Matlab).

Тем не менее, есть лучший способ обработки обратных вызовов, чем то, что вы делаете. Моя предпочтительная архитектура в этом сценарии состоит в том, чтобы один поток обслуживал аппаратное обеспечение и взаимодействовал с другими потоками через очереди сообщений (один для ввода, один для вывода и один для управления/управления, если вам нужно что-то сверхъестественное). тогда аппаратный поток просто сосредотачивается на обслуживании очередей. У вас есть второй поток, обрабатывающий обратные вызовы. Он читает очередь вывода аппаратного потока и обслуживает обратные вызовы. Я никогда не делал этого в Matlab (см. первый абзац), но это очень хорошо работает в контексте Java.

person John    schedule 24.03.2018
comment
Хорошо, я вижу добавление дополнительного потока в качестве посредника между Matlab и аппаратным потоком. - person Adam Jones; 24.03.2018