none
Executar Thread em um Arquivo .BAT RRS feed

  • Pergunta

  • Olá Galera!!!

    Estou com um problema e preciso de algumas dicas para tentar resolvê-lo..
    Desenvolvi um programa que chama um arquivo .bat e ele executa 3 tarefas consecutivas e retorna um arquivo para o programa continuar a execução..Esses 3 tarefas são sequenciais, isto é, o resultado de um é a entrada do outro..

    Até aki tudo funcionando perfeitamente..

    Agora entra o problema..Eu preciso fazer com que eles executem de forma paralela, ou seja, enquanto a primeira tarefa é realizada e gera um arquivo, a segunda já pega esse arquivo gerado (é claro, em partes) e vai executando para adiantar, e assim por diante..

    Alguém tem alguma idéia de como eu poderei fazer isso??Tem como eu implementar uma thread num simples arquivo .bat??Alguém tem algum código referência para me ajudar??

    Obrigado!!!
    domingo, 19 de julho de 2009 18:54

Respostas

  • Olá Vinícius,

    - O que cada um desses programas executados dentro do .BAT faz, exatamente?
    - Eles lêem/escrevem arquivos em disco? Lêem/cscrevem no Console? Quem faz o quê?
    - Eles foram desenvolvidos por você e/ou você tem o código-fonte em C# ou VB .NET?

    Partindo do princípio que você tem o código-fonte, o ideal seria desenvolver tudo em apenas um programa, com N threads (provavelmente 4 pela descrição do seu problema), e sincronizar a execução das threads conforme o processo é executado... Provavelmente a thread numero 1 iria ler um arquivo, e a cada X bytes lidos para uma fila de dados, sinaliza que a próxima thread pode continuar, esta por sua vez faz algo similar, e sinaliza para a próxima thread continuar o trabalho.

    A quarta thread, seria a thread principal da aplicação (controller), que fica responsável por monitorar a execução de todas as threads, e aguardar o processo acabar antes de devolver o controle para o usuário.

    Uma outra alternativa partindo do princípio que os outros programas escrevem os dados no Console, seria redirecionar a saída e capturar os dados que for recebendo, e passando para as outras threads... Os tópicos abaixo mostram como você pode fazer para capturar a saída do Console (Redirect):

    Resgatar retorno da janela de prompt DOS
    http://social.msdn.microsoft.com/Forums/pt-BR/504/thread/be3e7e34-0a2f-4653-98d2-f2b157d1551c

    Executar arquivo bat em gridview
    http://social.msdn.microsoft.com/Forums/pt-BR/504/thread/58b71f16-4f04-465a-b121-cfeaf4bfbe84


    Abraços,
    Caio Proiete





    Caio Proiete Siga-me no Twitter!
    http://www.caioproiete.com
    segunda-feira, 20 de julho de 2009 00:24
    Moderador
  • Vinícius,

    Minha sugestão é que você faça tudo no próprio código sem usar arquivo de lote.

    Na primeira tarefa (primeiro processo) utilize o método WaitForExit e então inicie os dois outros processos em seguida.
    http://msdn.microsoft.com/en-us/library/system.diagnostics.process.waitforexit.aspx

    Isso somente funciona se os dois processos seguintes somente realizam a leitura do arquivo.

    Ex:

    Process p1 = Process.Start("myprogram1.exe /out filename.txt");
    p1.WaitForExit();

    Process.Start("myprogram2.exe filename.txt");
    Process.Start("myprogram3.exe filename.txt");

    Att.

    Ari C. Raimundo
    domingo, 19 de julho de 2009 20:04
    Moderador

Todas as Respostas

  • Vinícius,

    Minha sugestão é que você faça tudo no próprio código sem usar arquivo de lote.

    Na primeira tarefa (primeiro processo) utilize o método WaitForExit e então inicie os dois outros processos em seguida.
    http://msdn.microsoft.com/en-us/library/system.diagnostics.process.waitforexit.aspx

    Isso somente funciona se os dois processos seguintes somente realizam a leitura do arquivo.

    Ex:

    Process p1 = Process.Start("myprogram1.exe /out filename.txt");
    p1.WaitForExit();

    Process.Start("myprogram2.exe filename.txt");
    Process.Start("myprogram3.exe filename.txt");

    Att.

    Ari C. Raimundo
    domingo, 19 de julho de 2009 20:04
    Moderador
  • Você disse que isso só funcionará se os processos somente realizam a leitura do arquivo..
    Eles geram arquivos de áudio, e tem a necessidade de copiá-los..

    Pelo que eu entendi do Wait for Exit ele só bloqueia os demais por um tempo..
    Mas o que eu preciso é o oposto disso que enquanto a saída do primeiro é gerada ela já esteja sendo lida pelo segundo!!

    Entendi bem???Será possível???

    Obrigado!!
    domingo, 19 de julho de 2009 20:10
  • Vinícius,

    Pela maneira que utilizei o método WaitForExit acima, o segundo e o terceiro processo somente serão executados após o primeiro ter terminado, que é o processo responsável pela criação do arquivo.

    Perceba que quando não passamos o tempo para o método WaitForExit a thread corrente tem sua execução bloqueada até que o processo termine, independente do tempo que este demande.

    Att.

    Ari C. Raimundo
    domingo, 19 de julho de 2009 20:24
    Moderador
  • Olá Vinícius,

    - O que cada um desses programas executados dentro do .BAT faz, exatamente?
    - Eles lêem/escrevem arquivos em disco? Lêem/cscrevem no Console? Quem faz o quê?
    - Eles foram desenvolvidos por você e/ou você tem o código-fonte em C# ou VB .NET?

    Partindo do princípio que você tem o código-fonte, o ideal seria desenvolver tudo em apenas um programa, com N threads (provavelmente 4 pela descrição do seu problema), e sincronizar a execução das threads conforme o processo é executado... Provavelmente a thread numero 1 iria ler um arquivo, e a cada X bytes lidos para uma fila de dados, sinaliza que a próxima thread pode continuar, esta por sua vez faz algo similar, e sinaliza para a próxima thread continuar o trabalho.

    A quarta thread, seria a thread principal da aplicação (controller), que fica responsável por monitorar a execução de todas as threads, e aguardar o processo acabar antes de devolver o controle para o usuário.

    Uma outra alternativa partindo do princípio que os outros programas escrevem os dados no Console, seria redirecionar a saída e capturar os dados que for recebendo, e passando para as outras threads... Os tópicos abaixo mostram como você pode fazer para capturar a saída do Console (Redirect):

    Resgatar retorno da janela de prompt DOS
    http://social.msdn.microsoft.com/Forums/pt-BR/504/thread/be3e7e34-0a2f-4653-98d2-f2b157d1551c

    Executar arquivo bat em gridview
    http://social.msdn.microsoft.com/Forums/pt-BR/504/thread/58b71f16-4f04-465a-b121-cfeaf4bfbe84


    Abraços,
    Caio Proiete





    Caio Proiete Siga-me no Twitter!
    http://www.caioproiete.com
    segunda-feira, 20 de julho de 2009 00:24
    Moderador
  • Olá Caio..Vamos ver se consigo te explicar mais ou menos meu programa..

    Essa etapa do arquivo .BAT é uma tentativa de automatização de um processo necessário pra alimentar um programa desenvolvido..Como disse o .BAT é chamado logo no início do código e tem 3 funções:
    - Chamar um programa que captura uma streamming de dados (rádio on-line, por exemplo) e salva no programa:
    EX: C:\> capture.exe http:\\127.0.0.1:8080 <tempo> <output_file>
    - Chamar um programa que converte esse arquivo gravado para o formato aceito pelo código (.WAV para .MP3, por exemplo)
    EX: C:\> lame.exe <input_file> <output_file>

    Entende melhor agora meu dilema??? Esses arquivos chamados são .exe somente baixados e usados para cada aplicação..

    Vc acha que dessa forma conseguiria fazer esse processo com N-Threads como sugeriu??? Ou existe algo melhor???

    Obrigado..
    segunda-feira, 20 de julho de 2009 23:34
  • Oi Vinícius,

    Realmente a abordagem de n-threads seria a melhor opção caso você implementasse os programas "do zero". Na atual situação não vejo problemas com a minha sugestão.

    Att.

    Ari C. Raimundo
    terça-feira, 21 de julho de 2009 01:04
    Moderador