Wednesday, 21 February 2018

Processo outputdatareceived waitforexit


Processo outputdatareceived waitforexit
Obter através da App Store Leia esta publicação em nosso aplicativo!
Process. start: como obter o resultado?
Gostaria de executar um programa de linha de comando externo do meu Mono / app. Por exemplo, eu gostaria de executar o mencoder. É possível:
Para obter a saída do shell da linha de comando e gravá-la na minha caixa de texto? Para obter o valor numérico para mostrar uma barra de progresso com o tempo decorrido?
Quando você cria seu objeto de processo, defina StartInfo de forma adequada:
então comece o processo e leia:
Você pode usar int. Parse () ou int. TryParse () para converter as seqüências de caracteres em valores numéricos. Você pode ter que fazer alguma manipulação de seqüência primeiro se houver caracteres numéricos inválidos nas cordas que você lê.
Você pode processar sua saída de forma síncrona ou assíncrona.
Observe que é melhor processar a saída e os erros: eles devem ser tratados separadamente.
(*) Para alguns comandos (aqui StartInfo. Arguments) você deve adicionar a diretiva / c, caso contrário, o processo congelará no WaitForExit ().
Se você não precisa fazer operações complicadas com a saída, você pode ignorar o método OutputHandler, apenas adicionando os manipuladores diretamente em linha:
A maneira padrão de fazer isso é ler do fluxo de Processo StandardOutput. Existe um exemplo nos documentos do MSDN vinculados. Da mesma forma, você pode ler do StandardError e gravar em StandardInput.
Tudo bem, para quem quer que ambos os Erros e Saídas leiam, mas obtém deadlocks com qualquer uma das soluções, fornecidas em outras respostas (como eu), aqui está uma solução que eu construí depois de ler a explicação MSDN para a propriedade StandardOutput.
A resposta é baseada no código do T30:
você pode usar memória compartilhada para os 2 processos para se comunicar, verifique o MemoryMappedFile.
você criará principalmente um arquivo mestre de memória mmf no processo pai usando a instrução "using", então crie o segundo processo até que ele termine e deixe-o escrever o resultado no mmf usando o BinaryWriter, então leia o resultado do mmf usando o processo pai , você também pode passar o nome mmf usando argumentos de linha de comando ou código rígido.
Certifique-se de que, ao usar o arquivo mapeado no processo pai, você faz o processo filho gravar o resultado no arquivo mapeado antes que o arquivo mapeado seja liberado no processo pai.
Exemplo: processo pai.
Para usar este exemplo, você precisará criar uma solução com 2 projetos dentro, então você leva o resultado de compilação do processo filho de% childDir% / bin / debug e copiá-lo para% parentDirectory% / bin / debug, em seguida, execute o projeto pai.
childDir e parentDirectory são os nomes das pastas dos seus projetos no pc boa sorte :)
Isso depende do mencoder. Se ele atingir esse status na linha de comando, então sim :)

Processo outputdatareceived waitforexit
Obter através da App Store Leia esta publicação em nosso aplicativo!
Process Wait for Exit não funciona.
Estou usando o código abaixo para baixar do youtube usando o script youtube-dl python.
Eu usei o processo dessa forma porque eu quero ter a porcentagem do script youtube-dl para mostrar na barra de progresso do meu lado do cliente.
Mas existem alguns problemas e é que o WaitForExit não está funcionando. Eu li de outros tópicos que esta questão está relacionada com a espera em processo não funcionando para processo infantil (quero dizer, a meu lado, a espera de saída funciona para o python não para o script youtube-dl)
O que devo fazer?
Uma vez que você está interessado em um processo infantil, talvez você tente pesquisar no processo do youtube usando o método:

Processo outputdatareceived waitforexit
Obter através da App Store Leia esta publicação em nosso aplicativo!
C # obter saída do processo durante a execução.
Existe de qualquer forma para redirecionar a saída padrão de um processo gerado e capturá-lo como acontecendo. Tudo o que vi apenas faz um ReadToEnd após o processo ter terminado. Gostaria de obter o resultado quando estiver sendo impresso.
Use Process. OutputDataReceived evento do processo, para receber os dados que você precisa.
Então, depois de um pouco mais de escavação descobri que ffmpeg usa stderr para saída. Aqui está o meu código modificado para obter o resultado.

Processo outputdatareceived waitforexit
Obter através da App Store Leia esta publicação em nosso aplicativo!
c # ProcessStartInfo. Start - leitura de saída, mas com tempo limite.
Se você quiser iniciar outro processo e aguardar (com tempo limite) para terminar, você pode usar o seguinte (do MSDN).
Se você quiser iniciar outro processo e ler sua saída, então você pode usar o seguinte padrão (de SO)
Como você pode combinar os dois para ler todas as entradas, não ficar preso no impasse e ter um tempo limite se o processo em execução for errado?
Essa técnica irá pendurar se o buffer de saída for preenchido com mais de 4 KB de dados. Um método mais infalível é registrar os delegados para serem notificados quando algo é escrito no fluxo de saída. Eu já sugeri este método antes em outro post:
Você não precisa combinar os dois - a classe Processo tem um evento que dispara quando a saída é enviada para o StandardOutput - OutputDataReceived.
Se você se inscrever no evento, você poderá ler o resultado conforme ele chega e, no seu ciclo de programa principal, você ainda pode perder tempo.
Você pode tentar modificar o primeiro método para algo assim.
Você também pode usar o APM, assim:
Defina um delegado para a chamada ReadToEnd:
Em seguida, use o delegado para chamar o método como este:
EDITAR: tratamento de erros removido por clareza.
Basta adicionar tudo do primeiro exemplo abaixo da chamada WaitForExit () ao segundo exemplo.

No comments:

Post a Comment