Executando um programa C ++ compilado em segundo plano e enviando entrada sempre que necessário

2

Eu tenho um programa compilado escrito em C ++ para um ambiente UNIX que possui esse tipo de estrutura:

int main(){
...
LoadEngine()
...
while(1){
    std::cin >> buffer;
    ...
    ExecuteFunction(buffer);
}
}

O carregamento do motor demora bastante, por isso estou a tentar iniciar primeiro o programa em segundo plano e, em seguida, enviar a entrada sempre que precisar.

Rodar o programa com o E comercial padrão anexado no final aparentemente não faz o programa rodar em segundo plano, mas pára em std :: cin até que uma entrada seja recebida do console, e pára depois que uma entrada é aceita no console.

Como executo o programa de forma que o programa seja executado continuamente em segundo plano e receba entrada e execute a função sempre que necessário?

EDIT : O produto final é um pequeno dispositivo (RaspberryPi) que reconhece a fala e faz algo com base nas palavras reconhecidas. O programa que eu tenho é a parte em que o dispositivo faz algo baseado na palavra input, e a palavra input corresponde à variável buffer do trecho de código acima.

Portanto, a parte std :: cin é um código de linha fictício que estou usando para testar se minha parte do código inicializa no processo em segundo plano (para carregar o mecanismo) e seja lá o que for projetado para fazer.

EDIT 2 : Para esclarecer o que estou tentando alcançar, o programa recebe uma entrada de um reconhecedor de fala e faz coisas (por exemplo, sintetizar fala de entrada, enviar sinais para LEDs, etc. ). A entrada de texto pode ser obtida diretamente do console (que meu código está atualmente fazendo), ou algum outro método que eu não conheço. A única coisa que a entrada adere é que deve ser um texto, e é enviado de outro programa que reconhece a fala (que é manipulado por algum outro desenvolvedor). Então, o método exato não é especificado. Tudo o que tenho que me preocupar é com o meu lado do programa, que executa uma função a partir de uma entrada de texto (por exemplo, buffer do snippet de código). Então, a estrutura geral seria algo como isto:

Int main(){
LoadEngine()
while(1){
    buffer = ReceiveInput();
    ExecuteFunction(buffer);
 }}

Onde a parte ReceiveInput () está atualmente implementada como std :: cin . Ele realmente pode ser qualquer método, desde que o mecanismo seja carregado uma vez no começo, e o programa seja capaz de executar ExecuteFunction a partir de uma entrada até que o dispositivo seja desligado.

    
por stock username 27.08.2015 / 05:27

3 respostas

0

Isso é estranho e inconveniente, mas possivelmente menos do que as outras respostas:

Toda vez que seu programa pede informações:

  1. Entre em um prompt de shell - e refiro-me ao shell que iniciou seu programa. (Isto é, o fato de você não estar apenas executando o programa "engine" em primeiro plano sugere que você está usando o terminal para outra coisa, como talvez editar arquivos. Toda vez que seu programa pede entrada, você precisará salvar e sair do editor, e volte ao seu shell principal. Ou você pode suspender o editor; mas isso torna o próximo passo mais complicado.)
  2. Digite fg (seguido por Enter , é claro) para trazer o seu trabalho de fundo para o primeiro plano. Se você tiver vários trabalhos em segundo plano (como sugerido acima), faça o que você precisa fazer para colocar seu programa "engine" em primeiro plano.
  3. Interaja com o programa.
  4. Quando estiver pronto para retomar a execução (computação, etc.) por um tempo, pressione Ctrl + Z e, em seguida, bg (seguido por Enter ).

Repita o procedimento acima enquanto o programa for executado.

    
por 27.08.2015 / 17:58
1

É improvável que isso seja possível. Em tais casos, normalmente você precisa ouvir a porta da rede, aceitar () a conexão e ler os dados, e fazer o que precisar. Então você precisa de algum aplicativo cliente também para enviar dados. É assim que os aplicativos em segundo plano normalmente funcionam.

    
por 27.08.2015 / 06:48
0

Você precisaria enviar ao seu aplicativo uma chamada de ativação, para saber quando escutar a entrada e onde esperá-la (já que executá-la em segundo plano a separa do processo do terminal). A melhor solução seria criar um programa separado que serviria como uma interface para o mecanismo - como o mecanismo se parece com o seu problema. Forneça um conjunto de funções para se comunicar com ele e escreva um script simples que, quando executado, enviará entrada para o mecanismo. O mecanismo será executado em segundo plano e outros programas serão conectados a ele. Essa é a melhor coisa que posso fazer no momento.

    
por 27.08.2015 / 09:53