Создать процесс и запустить код после того, как процесс вернет сообщение (C ++) - PullRequest
0 голосов
/ 17 сентября 2011

Я пытаюсь создать новый процесс (который не должен блокировать текущую программу) в C ++ и заставить C ++ прослушивать сообщение. Когда приходит сообщение, я хочу запустить еще немного кода.

У меня есть этот метод, который выполняет команду и сразу же приводит результат, но я не знаю, как создать тот, который запускает код, когда процесс возвращает сообщение:

    string exec(const char* cmd)
    {
        // popen for *nix
        FILE* pipe = _popen(cmd, "r");

        if (!pipe)
            return "";

        char buffer[128];
        string result = "";

        while(!feof(pipe)) {
            if(fgets(buffer, 128, pipe) != NULL)
                result += buffer;
        }

        // pclose for *nix
        _pclose(pipe);

        return result;
    }

Примечание: процесс может вернуть сообщение через 1-3 секунды, после чего процесс продолжит выполнение, поэтому приведенный выше код недостаточен, поскольку выполненная программа никогда не завершится.

Ответы [ 2 ]

1 голос
/ 17 сентября 2011

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

0 голосов
/ 17 сентября 2011

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

Как именно вы это сделаете, зависит от структуры остального кода.Например, если у вас уже есть таблица периодических событий, то это очень просто.Если у вас есть схема выбора типа «выбор», она снова очень проста.

Если у вас еще ничего из этого нет, напишите функцию «CheckIfTheresAnythingToDo».Имейте логический флаг, который указывает, запущен ли у вас дочерний процесс.В 'CheckIfThereAnythingToDo' немедленно возвращайтесь, если флаг снят.Если он установлен, позвоните select и посмотрите, было ли получено сообщение.Если это так, позвоните по коду, который вам нужен.(Я бы порекомендовал не использовать стандартный ввод / вывод, потому что он не очень хорошо сочетается с неблокирующей семантикой, когда вам нужно делать больше, чем одну вещь за раз.)

Затем просто позвоните CheckIfTheresAnythingToDo включевые моменты в вашем коде.Если у вас есть какая-то структура цикла, вызывайте ее один раз на каждом проходе цикла.Если у вас есть код, который ожидает чего-то, попросите функцию ожидания вызвать его.

Но это тот тип вещей, который вы уже должны знать, как делать, когда начинали свой дизайн.«Мне нужно что-то проверять время от времени» - это очень типичное требование, и, если ваш общий дизайн не может его удовлетворить, вам следует переосмыслить этот проект.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...