Как я могу создать постоянный список глобально доступных объектов, запрашиваемых из потоков? - PullRequest
0 голосов
/ 16 апреля 2020

Я пытался получить постоянный объект из потока в течение нескольких часов. Я хочу написать разделяемую библиотеку на C ++, которая запускает постоянный l oop в функции. В следующих фрагментах кода есть класс Process. Процесс инициализирует интерфейс TCP / IP для чтения и записи данных из модели Simulink.

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

main. cpp

Я знаю, это выглядит некрасиво / непрофессионально, но я довольно плохо знаком с C ++ ..

// frustrated attempt to make everything persistent
static vector<std::thread> processThreads;
static ProcessHandle processHandle;
static vector<std::promise<Process>> promiseProcess;
static vector<std::future<Process>> futureProcess;

EXPORT int initializeProcessLoop(const char *host, int port)
{
    std::promise<Process> promiseObj;
    futureProcess.push_back(std::future<Process>(promiseObj.get_future()));
    processThreads.push_back(std::thread(&ProcessHandle::addProcess, processHandle, host, port, &promiseProcess[0]));

    Process val = futureProcess[0].get();

    processHandle.handleList.push_back(val);

    return (processHandle.handleList.size() - 1);
}

ProcessHandle. cpp

Функция addProcess из ProcessHandle создает процесс, который должен быть постоянным, добавляет его к члену вектора STATIC c в ProcessHandle и передает обещание выполнению l oop.

int ProcessHandle::addProcess(const char *address, int port, std::promise<Process> * promiseObj) {
    Process process(address, port);

    handleList.push_back(process);
    handleList[handleList.size() - 1].exec(promiseObj);
    return handleList.size() - 1;
}

К основной проблеме сейчас ...

Если я изменю "initializeProcessL oop", чтобы включить:

    if(processHandle.handleList[0].isConnected())
    {
        processHandle.handleList[0].poll("/Compare To Constant/const");
    }

после того, как я нажал "val" для processHandle. handleList все работает нормально, и я могу опрашивать данные, как и должно быть.

Если я вместо этого опрошу их из - для проверки - основной функции, l oop вылетает внутри "initializeProcessL oop" потому что "Процесс Val" является ре назначенный (?) с futureProcess [0] .get ().

Как получить согласованность переменной Process и потока l oop после возврата из функции?

Если есть Есть какие-либо вопросы к коду (и я держу пари, что будет), не стесняйтесь спрашивать. Заранее спасибо!

PS: Обязательно "Engli sh не мой родной язык, прошу прощения за любые орфографические ошибки или gibberi sh" ...

1 Ответ

0 голосов
/ 16 апреля 2020

Хорошо, сначала я должен объявить, что стиль кодирования выше и ниже ни в коем случае не является наилучшей практикой.

Хотя Сэм Варшавчик все еще прав в том, как правильно изучать C ++, просто меняя

Process val = futureProcess[0].get();

до

static Process val = futureProcess[0].get();

сделал работу.

Чтобы было ясно: не делайте этого. Это быстрое решение, но оно будет иметь неприятные последствия в будущем. Но я надеюсь, что это поможет любому с подобной проблемой.

Если у кого-то есть лучшее решение (оно не может быть хуже, не так ли?), Не стесняйтесь добавлять свой ответ на этот вопрос.

...