Редакция 2: Проблема решена, см. Мой ответ.Асинхронный вызов engEvalString MATLAB
Я пишу программу на С ++, которая общается с MATLAB через Engine API. Приложение C++ работает в Windows 7 и взаимодействует с MATLAB 2012b (32-разрядная версия).
Я хотел бы заняться трудоемким обращением к двигателю MATLAB, используя engEvalString
, но не могу понять, как сделать асинхронный вызов. Обратный вызов не требуется (но было бы неплохо, если это было возможно).
Ниже приведен минимальный пример того, что не работает.
#include <boost/thread.hpp>
extern "C" {
#include <engine.h>
}
int main()
{
Engine* eng = engOpen("");
engEvalString(eng,"x=10");
boost::thread asyncEval(&engEvalString,eng,"y=5");
boost::this_thread::sleep(boost::posix_time::seconds(10));
return 0;
}
После запуска этой программы, я переключаюсь на окно двигателя MATLAB и найти:
» x
x =
10
» y
Undefined function or variable 'y'.
Таким образом, кажется, что второй вызов, который должен положить у = 5, никогда не обрабатывается MATLAB двигатель.
Поток определенно работает, вы можете проверить это, переместив вызов engEvalString
в локальную функцию и вместо этого запустив это как поток.
Я действительно в тупике и буду благодарен за любые предложения!
EDIT: Как указал Шафик в своем ответе, двигатель не является потокобезопасным. Я не думаю, что это должно быть проблемой для моего случая использования, поскольку вызовы, которые мне нужно сделать, составляют ~ 5 секунд друг от друга, для расчета требуется 2 секунды. Причина, по которой я не могу дождаться этого вычисления, заключается в том, что приложение C++ является «средним жестким» контроллером реального времени, который должен отправлять команды с частотой 50 Гц. Если этот показатель опускается ниже 30 Гц, робот будет принимать сетевые проблемы и закрыть соединение.
Я хотел бы добавить, что вызов engOpen ("") занимает относительно много времени, поэтому, когда это возможно, Engine * следует кэшировать для повторного использования в том же потоке. Если я кэширую значение для синхронных вызовов, я могу достичь скорости петли 50 Гц (с большим количеством другой сложной обработки, это примерно предел моего ноутбука), если я получу новый движок для каждого вызова, я могу только достичь 25 Гц. –