Então, estou enfrentando esse problema por algum tempo agora e tentei muitas maneiras diferentes de corrigi-lo, mas não posso. 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 12 às 15: 54 Estou trabalhando em um programa que é uma fila para enviar milhares de corridas usando o programa XXX em uma estação de trabalho 8 núcleo X5560 (2P). Os tempos de execução podem ser de alguns minutos a frações de um segundo. O código da minha fila irá iniciar até 8 threads e é controlado por um temporizador que se ajusta a qualquer lugar de 100ms a 2000ms dependendo da carga. Nunca há mais de 8 trabalhos em execução. A fila funciona bem, o rendimento é muito bom e os trabalhos que levam mais de alguns segundos correm bem. O problema que estou tendo é quando os tempos de execução são pequenos, por exemplo .25 segundos. Tudo funciona bem para cerca de 700 execuções. O cpus é mantido ocupado e a taxa de transferência é alta. Então eu começo a obter instâncias de XXX que completem, mas o sistema parece mantê-los em um estado de espera para qualquer lugar de alguns segundos a mais de um minuto, e o uso total da CPU do sistema cai para zero. O sistema pode permanecer ocioso por 30 segundos ou mais, altura em que são executadas 200 execuções, então o problema se repete. O sistema parece estar no impasse. Por que esses processos Zombie acontecem e como posso evitá-lo? Fico sem idéias. Eu mantenho uma lista de tarefas para executar do tipo QueueRec. Este código Execute é iniciado em um tópico criado pela Fila. Eu mantenho um pool de ystem :: Diagnostics :: Processo que eu reuso. -------------------------------------------------- ------ classe de referência pública QueueRec public: DateTime mtimequeued DateTime mtimesubmitted DataTime mtimecompleted TimeSpan melapsedtime TimeSpan mcputime Thread mthread bool mrunsuccess int mprocnum public: static arrayltSystem :: Diagnostics :: Process gt mprocs. Inicializado em outro lugar JobStatus mstatus String margs String mdir bool QueueRec :: Exceute (bool showwindow) bool sucesso falso Sistema :: Diagnóstico :: Process proc mprocsmprocnum proc-gtStartInfo-gtRedirectStandardOutput true proc-gtStartInfo-gtUseShellExecute false proc-gtStartInfo-gtFileNamequotXXXquot proc-gtStartInfo - GtArguments margs proc-gtStartInfo-gtWorkingDirectory mdir proc-gtStartInfo-gtCreateNoWindow showwindow proc-gtStartInfo-gtErrorDialog true proc-gtStart () proc-gtWaitForExit () String resultado proc-gtStandardOutput-gtReadLine () se (resultado-gtContains (quotRUN COMPLETEDquot)) sucesso True mcputime proc-gtTotalProcessorTime if (mcputime. TotalMillisecondslt1000) Sleep (1000 - mcputime. TotalMilliseconds) tentativa desesperada de corrigir proc-gtKill () mproc-gtClose () procnullptr catch (.) Retorno sucesso Domingo, 27 de janeiro de 2013 7:20 PM Obrigado Reed, vou olhar para isso. Eu fiz mais alguns testes e parece que a leitura do disco provavelmente é o culpado. O problema foi aliviado quando usei uma unidade SAS em vez de uma unidade eSATA. Depois de fazer algumas pesquisas, aumentou a memória usada para armazenamento em disco, alterando o seguinte valor de registro de 0 para 1. HKEYLOCALMACHINESYSTEMCurrentControlSetControlSession ManagerMemory ManagementLargeSystemCache Isso fez uma grande melhoria. Eu tenho que fazer mais testes para ver se a solução é aceitável. Obrigado pelas sugestões, Marcado como resposta por Stephen Toub - empregado MSFT da Microsoft, proprietário Quinta-feira, 31 de janeiro de 2013 7:46 PM segunda-feira, 28 de janeiro de 2013 7:39 PM Todas as respostas Infelizmente, você não está mostrando sua fila e sua sincronização em A postagem (nem usar as extensões paralelas para) - então é difícil dizer por que pode haver um impasse. Você está usando uma coleção thread-safe, como ConcurrentQueueltTgt Se não, o problema pode estar em sincronização da própria fila. Você pode querer ver o BlockingCollectionltTgt em vez de usar uma fila diretamente, também, como está orientado para esse tipo de trabalho. Reed Copsey, Jr. - reedcopsey Se uma postagem responder a sua pergunta, clique em quot Mark As Answer no quot dessa publicação e quot Mark as Helpful quot. Domingo, 27 de janeiro de 2013 7:31 PM Reed, Obrigado pela resposta. Eu uso Monitor :: Enter and Monitor :: Sair para fazer a sincronização e garantir que o código seja thread-safe. Posso dizer que o código da fila não é o problema porque o Windows Resource Monitor mostra instâncias de XXX com o status de Executar por períodos que são muito mais longos do que o tempo de execução, enquanto o uso da CPU do sistema é zero. Por exemplo, o tempo de CPU para um processo XXX pode ser de .25 segundos, mas o processo não termina por 15 segundos. Quando isso acontece com 8 instâncias de XXX, o uso total da CPU torna-se 0. O Resourse Monitor mostra claramente 8 instâncias de XXX executando quase continuamente para que o código da fila esteja funcionando bem. O tempo de CPU XXX é capturado como mostrado no código. O tempo decorrido é capturado da seguinte forma DateTime t1 DateTime :: Agora DateTime t2 DateTime :: Agora TimeSpan transcorrido t1.Subtract (t1) Posso publicar os tempos decorridos e da CPU, conforme os trabalhos concluíram para que eu possa comparar. Também executou dezenas de milhares de casos de teste em que o tempo da CPU para XXX é de 4-7 segundos e nenhum problema foi encontrado. O único bloqueio é no proc-gtWaitForExit () (e Monitor :: Enter for critical sections) Eu suspeito que algum recurso do sistema pode estar sobrecarregado. O sistema pode aguardar a conclusão de alguma atividade do disco, pois uma grande quantidade de arquivos está sendo criada. Quando o tempo de execução é curto, um grande número de arquivos são criados quando o tempo de execução é maior, e menos arquivos são criados, mas são maiores. Eu tenho que investigar essa possibilidade. Domingo, 27 de janeiro de 2013 11:46 PM O disco IO é sempre um bom candidato para esses tipos ou problemas - Em geral, o disco IO no mesmo prato terminará sendo serial, por isso ter vários threads que escrevem arquivos no disco ao mesmo tempo podem realmente Desacelere seu processamento, já que você adiciona disputa lá. Eu realmente recomendo tentar o TPL para isso - Parallel. ForForEach, enquanto um pouco de dor do C4343, é muito bom para equilibrar o carregamento dinâmico com base no trabalho envolvido. Em vez de sempre usar quot8 threadsquot, eles se ajustarão conforme necessário, o que muitas vezes pode ser melhor no longo prazo (embora muitas vezes precise ser modificado por particionamento personalizado, etc.). Reed Copsey, Jr. - reedcopsey Se uma postagem responder a sua pergunta, clique em quot Mark As Answer no quot dessa publicação e quot Mark as Helpful quot. Segunda-feira, 28 de janeiro de 2013 5:22 PM Obrigado Reed, vou olhar para isso. Eu fiz mais alguns testes e parece que a leitura do disco provavelmente é o culpado. O problema foi aliviado quando usei uma unidade SAS em vez de uma unidade eSATA. Depois de fazer algumas pesquisas, aumentou a memória usada para armazenamento em disco, alterando o seguinte valor de registro de 0 para 1. HKEYLOCALMACHINESYSTEMCurrentControlSetControlSession ManagerMemory ManagementLargeSystemCache Isso fez uma grande melhoria. Eu tenho que fazer mais testes para ver se a solução é aceitável. Obrigado pelas sugestões, Marcado como resposta por Stephen Toub - empregado Microsoft MSFT, proprietário Quinta-feira, 31 de janeiro de 2013 7:46 PM Segunda-feira, 28 de janeiro de 2013 19:39 A Microsoft está realizando uma pesquisa on-line para entender sua opinião sobre o Msdn Local na rede Internet. Se você optar por participar, a pesquisa on-line será apresentada quando você deixar o site Msdn. Gostaria de participar Ajude-nos a melhorar o MSDN. Visite a nossa página UserVoice para enviar e votar ideias Centros Dev Recursos de aprendizagem
No comments:
Post a Comment