Wednesday 26 July 2017

Waitoutxit Timeout Não Está Funcionando


O código parece quase isso: como você pode ver, o código inicia um processo cmd. exe e passa para ele o comando que quero ser executado. Eu redireciono StandardError e StandarOutput para lê-los a partir do código. O código lê-los antes do processo. WaitForExit (Timeout) chamada conforme recomendado pela Microsoft (mais sobre isso mais tarde). O problema surge se o comando que eu envio para cmd. exe nunca termina ou trava indefinidamente. No código eu usei o comando ping - t 8.8.8.8 que, por causa da opção - t, pings o host sem parar. O que acontece O processo cmd. exe juntamente com o comando ping - t nunca sai e nunca fecha o fluxo de stdout e, portanto, o nosso código trava na linha Output. StandardOutput. ReadToEnd () do processo de saída porque não conseguiu ler todo o fluxo. O mesmo acontece também se um comando em um arquivo em lotes trava por qualquer motivo e, portanto, o código acima pode funcionar continuamente durante anos e, em seguida, é suspenso repentinamente sem nenhum motivo aparente. Antes de escrever, recomendava ler fluxos redirecionados antes do processo. WaitForExit (Timeout), bem, isso é especialmente verdadeiro se você usar a assinatura WaitForExit sem o tempo limite. Se você chamar processo. WaitForExit () antes de ler os fluxos redirecionados: código 2: você pode enfrentar um impasse se o comando que você anexar ao cmd. exe ou o processo que você está chamando preencher a saída padrão ou erro padrão. Isso porque nosso código não pode atingir as linhas de processo de saída. StandardOutput. ReadToEnd () De fato, o processo filho (o comando ping ou um arquivo em lote ou o processo que estiver executando) não pode continuar se o nosso programa não lê os buffers preenchidos dos fluxos e isso não pode acontecer porque o código está pendurado em A linha com o processo. WaitForExit () que aguardará para sempre que o projeto filho saia. O tamanho padrão de ambos os fluxos é de 4096 bytes. Você pode testar esses dois tamanhos com esses arquivos em lote: o primeiro script escreve 4096 bytes para a saída padrão e o segundo para erro padrão. Salve um destes em C: testbuffsize. bat e execute o processo de chamada do nosso programa. WaitForExit () antes do processo de saída. StandardOutput. ReadToEnd () como no código 2. Você pode fazê-lo escrevendo CommandResult Resultado ExecuteShellCommandSync (c: testbuffsize. bat, 1000) na linha 13 do código 1. O código não irá pendurar, mas se você escrever um byte mais em qualquer um dos dois fluxos, ele irá transbordar o tamanho do buffer tornando o programa aguentar. Se você precisa redirecionar e ler a saída padrão ou o erro padrão, a melhor solução é lê-los de forma assíncrona. Uma excelente maneira de fazer isso é proposta por Mark Byers neste segmento stackoverflow. Como a última coisa, observe que, se o processo filho sair apenas porque você usa o processo. WaitForExit (Timeout) assinatura e ele realmente vai no tempo limite, você deve matar o processo cmd. exe e seus possíveis filhos. Então eu tenho lutado este problema por algum tempo agora e tentei muitas maneiras diferentes de corrigi-lo, mas não pode. Basicamente, se o meu aplicativo é chamado de um arquivo java para carregar um aplicativo em um dispositivo. Enquanto está carregando sua impressão para uma caixa de richtext, então eu gostaria de passar para o próximo arquivo. O problema que estou tendo é que, enquanto o primeiro arquivo está sendo carregado, o 2º tenta carregar quais problemas de casos. Eu tentei a espera para a saída, mas se eu fizer isso, então os dados de saída não são escritos na caixa de texto rica. Todas as idéias que tentei colocar a espera para a saída em muitos lugares diferentes, mas isso não parece funcionar. Dois métodos abaixo escrevem o stdout ou erro no campo richtext. Qualquer idéia seria excelente. Basicamente, preciso do processo para sair, então eu posso continuar a pensar que o forloop carrega o próximo arquivo. Você está recebendo algum tipo de mensagem de erro. Parece-me que seus argumentos são - Xmx512M - jar. Falta um espaço após a opção de linha de comando - jar. Isso poderia estar fazendo com que ele simplesmente saia imediatamente devido a não poder entender o comando. Além disso, como sugeriu M. Babcock, mova o método loaddPB para fora da linha UI e certifique-se de que envolve a parte de carregamento em um semáforo, dessa forma apenas um único arquivo é carregado de cada vez e a IU pode continuar a fazer o que precisa façam. Ndash SPFiredrake 9 de fevereiro às 15:29 Esteja avisado que este é um pouco quotackishquot em que você ainda está bloqueando o thread UI, mas você está bombeando manualmente os eventos através da fila de mensagens. Esta não é uma prática recomendada, e a maioria dos desenvolvedores recomendará contra ela. A melhor opção é lançar o código de carregamento em um segmento separado. Ndash SPFiredrake 9 de fevereiro às 15:54

No comments:

Post a Comment