Friday 22 September 2017

Exemplo De Exemplo Cfore De Waitforexit


Eu uso Process. Start para iniciar um arquivo em lote. O arquivo em lote usa o comando START para iniciar vários programas em paralelo e depois sai. Uma vez que o arquivo em lotes é concluído Process. HasExited torna-se verdadeiro e Process. ExitCode contém o código de saída correto. Mas quando chamo Process. WaitForExit (), ele trava nunca retorna. O código a seguir demonstra o problema. Ele cria um arquivo em lotes, o inicia e depois imprime: Ele deve imprimir: mas nunca o faz (mesmo que HasExited seja verdadeiro e já temos um ExitCode). Notei que isso só ocorre quando o arquivo em lotes contém comandos START e quando a saída padrão e o erro padrão são redirecionados. Por que WaitForExit () nunca retorna O que é o caminho certo para aguardar o encerramento de um processo desse tipo É seguro apenas pesquisar Process. HasExited ou pode resultar em outros problemas PS. Acabei de notar que chamar WaitForExit (100000) com um tempo limite enorme (que definitivamente não expira) retorna imediatamente quando o processo sai. Wierd. Sem tempo limite, ele trava. Existe uma diferença fundamental quando você chama WaitForExit () sem tempo limite, ele garante que o stdouterr redirecionado tenha retornado EOF. Isso garante que você tenha lido toda a saída que foi produzida pelo processo. Nós não podemos ver o que o quotonOutputquot faz, mas as chances de que ele impede o seu programa porque ele faz algo desagradável como assumir que seu segmento principal está ocioso quando ele está realmente preso em WaitForExit (). Ndash Hans Passant 3 nov 14 às 12:06 Isso parece ser um artefato (Id say bug) na implementação específica do tratamento assíncrono baseado em eventos do StandardOutput e do StandardError. Percebi que, enquanto consegui reproduzir facilmente o seu problema, simplesmente executando o código que você forneceu (excelente exemplo de código, a propósito.)), O processo realmente não era suspenso indefinidamente. Em vez disso, ele retornou de WaitForExit () uma vez que ambos os processos filho que tinham sido iniciados já haviam saído. Isso parece ser uma parte intencional da implementação da classe Process. Em particular, no método Process. WaitForExit (), uma vez que terminou de aguardar o processo, ele verifica se um leitor para stdout ou stderr foi criado se assim for, e se o valor de tempo limite para o WaitForExit ( ) Chamada é infinita (ou seja, -1), o código realmente espera o fim do fluxo no (s) leitor (es). Cada leitor respectivo é criado somente quando o método BeginOutputReadLine () ou BeginErrorReadLine () é chamado. Os fluxos stdout e stderr não estão fechados até que os processos filho tenham fechado. Então, esperando no final desses fluxos irá bloquear até que isso aconteça. Que WaitForExit () deve se comportar de forma diferente, dependendo se um tenha chamado qualquer um dos métodos que iniciam a leitura baseada em eventos dos fluxos ou não, e especialmente porque a leitura desses fluxos diretamente não causa WaitForExit () para comportar-se desse jeito, cria Uma inconsistência na API que torna muito mais difícil de entender e usar. Enquanto eu pessoalmente chamo isso de bug, suponho que seja possível que o (s) implementador (es) da classe Process esteja ciente dessa inconsistência e criou isso de propósito. Em qualquer caso, o trabalho seria ler StandardOutput e StandardError diretamente em vez de usar a parte baseada em eventos da API. (Embora, é claro, se o código estivesse esperando nesses fluxos, verificaria o mesmo comportamento de bloqueio até que o filho fique próximo.) Por exemplo (C, porque eu não conheço F o suficiente para tapar um exemplo de código assim juntado rapidamente :)): Espero que o trabalho acima ou algo semelhante abordará o problema básico em que você se encontrou. Meus agradecimentos ao comentarista Niels Vorgaard Christensen por dirigir-me para as linhas problemáticas no método WaitForExit (), para que eu possa melhorar esta resposta. Eu tenho um aplicativo C que eu quero começar da VB. Eu consegui fazer isso dessa maneira: Dim startInfo As ProcessStartInfo Dim pStart Como Novo Processo startInfo Novo ProcessStartInfo (AppDirectory) O AppDirectory é o diretório do meu aplicativo C, a idéia por trás de tudo isso é que eu quero fazer uma interface de usuário que leve alguma contribuição do usuário, salve-os em um texto Arquivo, iniciar o programa C que lê as informações do arquivo de texto e fazer o que é suposto fazer. O problema é que quando eu faço isso, a aplicação C é executada, mas não lê o arquivo de texto. Na verdade, eu tentei um programa fofo, onde eu acabei de escrever um programa C que lê de um arquivo de texto e basta lançá-lo da VB e ainda o programa C ainda não leu do arquivo txt. Qualquer idéia. (Btw, quando o C é executado diretamente (não através de VB), ele funciona 100) sexta-feira, 28 de dezembro de 2007 3:01 PM

No comments:

Post a Comment