Мы запускаем приложение в отдельном потоке, для взаимодействия используем сигналы и слоты. Запускать можно виджет со схемой, сам симулятор и вручную проводить инициализацию, а можно и само mainwindow. Сигнал-слоты, потокобезопасны, включая функцию connect. В оригинальном коде симулятора действуют статические указатели на определенные компоненты: симулятор можно запустить вызвав
Код: Выделить всё
Simulator::self()->runContinuous();
Код: Выделить всё
QObject::connect(Circuit::self()->findChild<Led*>("Led-2"), &Led::stateChanged, receiver, &Receiver_class::stateChanged);
Основная проблема - это QApplication. Потоки то у нас разные, а QApplication две штуки выходит. Вернее QCoreApplication и QApplication в другом потоке. Вместе они существовать не могут, так еще и GUI должен быть в потоке QApplication.
В этом случае думаю, что можно вот так сделать.
Мы парсим (парсер в qt можно создавать до QApplication) аргументы строки и создаем либо std::thread с QApplication и самим симулятором, либо действуем по старой схеме. В первом случае просто вызываем Circuit::self()->loadCirc("pathtocircuit") в коде локомотива. Второй случай для локомотивов без симуляции схем.
Код: Выделить всё
void startsim(int argc, char *argv[])
{
QApplication a(argc, argv);
MainWindow w;
w.show();
a.exec();
}
И на самом интересном месте мы опять попадаем в singleton ловушку, на этот раз уже в самом симуляторе. Помните?
Код: Выделить всё
Simulator::self()->runContinuous();
А если мы захотим запустить несколько локомотивов? А может электричку? Необходима новая синглтоновая обертка, которая будет жить в потоке QApplication, создавать и удалять mainwidow, управлять и предоставлять указатели на главные компоненты объектов симулятора для его внутренностей, API для класса vehicle.
Для этого нужно избавиться от статических указателей понатыканных во всем симуляторе схем. Работа получается огромная, но я уже ее начал. К тому же мне помогает еще то, что в симуляторе будут отсутствовать виджеты редактирования и их компоненты.
Остается еще несколько вопросов к ув. maisvendoo т.к. код RRS я еще не так подробно изучил
Выходит мы ломаем концепцию simulator как отдельного процесса. Возможна ли такая модификация? Лично я думаю, что было бы неплохо создавать окна в коде локомотива. Хотя бы для сообщений, какого-нибудь машинного или клавиатуры клуба.
Вроде OSG qt умеет показывать виджеты? Может mainwindow туда отправлять? Или так нельзя?
Возможна ли вообще такая плотная интеграция симулятора схем с RRS? Стоит мне продолжать работу над этим?
P.S.
Уже сейчас по вышеописанной схеме, но пока со статическими указателями симулятор схем запускается и работает в приложении "затычка"
Готов выслушать все предложения!
Github: https://github.com/asafran/SimulIDE-lib