Блокировка до завершения процесса в Tiny Process Library

Я пишу код C ++, который принимает аргумент командной строки, передает его системной команде, например echo и печатает ответ. Для связи с внешним процессом я использую крошечный процесс библиотека. Проблема с моим текущим кодом состоит в том, что он должен ждать настроенную задержку 5 seconds,

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

Test.cpp: In lambda function:
Test.cpp:29:3: error: ‘p_Request’ is not captured

Может кто-нибудь, пожалуйста, помогите мне убрать задержку и заполнить Result объект, когда внешняя команда завершает свое выполнение?

test.cpp

#include "process.hpp"#include <iostream>
#include <string>

using namespace TinyProcessLib;
using namespace std;

class Request{

public:

string s_Request;

bool b_requestProcessed = false;

bool b_error = false;

string s_Response = "No response yet";

};

void processCommand( Request* );

int main(int argc, char *argv[]){

Request *p_Request = new Request();
p_Request->s_Request = argv[1];
processCommand( p_Request );
while(!p_Request->b_requestProcessed){
}
cout << p_Request->s_Response << endl;
}void processCommand( Request* p_Request ){

if(!p_Request){
p_Request->b_error = true;
return;
}
auto output=make_shared<string>();
Process process(string("echo ") + string(p_Request->s_Request), "", [output](const char *bytes, size_t n){
*output+=string(bytes, n);
});
// Help me to remove this delay
this_thread::sleep_for(chrono::seconds(5));
p_Request->s_Response=*output;
auto exit_status=process.get_exit_status();
if(exit_status == 0){
p_Request->b_requestProcessed = true;
p_Request->b_error = false;
}else{

p_Request->b_error = true;
p_Request->s_Response="Command Execution Failed";
}

}

Команда компиляции

g++ -std=c++11 -pthread process.cpp process_unix.cpp Test.cpp -o Test

Результат с задержкой

./Test  "Hello Stack Overflow"Hello Stack Overflow

Результат без задержки

./Test  "Hello Stack Overflow"[[EMPTY_LINE]]

2

Решение

this_thread::sleep_for(chrono::seconds(5));
p_Request->s_Response=*output;
auto exit_status=process.get_exit_status();

Изменить на

auto exit_status=process.get_exit_status();
p_Request->s_Response=*output;

.Get_exit_status () ожидает завершения процесса, и ваш вывод = * делает копию. Таким образом, в первой версии вы копируете пустую строку (поскольку процесс еще не завершен), а во второй он ожидает завершения процесса, прежде чем делать копию.

4

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]