Função extended do Run

Aqui você poderá oferecer suas Contribuições, Dicas e Tutoriais (Texto ou Vídeo) que sejam de interesse de todos.

Moderador: Moderadores

rossine
Usuário Nível 3
Usuário Nível 3
Mensagens: 325
Registrado em: 06 Ago 2007 09:57
Localização: Divinópolis-MG

Função extended do Run

Mensagem por rossine »

Olá,

Gostaria de compartilhar com vocês uma função que criei aqui para executar processos externos. Segue abaixo um exemplo e a função:

Código: Selecionar todos

/*

  Exemplo de uso da função MyRunProc

  By Rossine

*/

#include "fileio.ch"

function Main

cls

hb_memowrit( "teste.txt", "Arquivo de teste..." )

? "Retorno:", myRunProc( "notepad teste.txt", .T., { || qout( "Aguardando Notepad encerrar..." ) }, 1 )

wait "Quando chegar aqui o notepad ja foi encerrado. Tecle ENTER..."

? "Retorno:", myRunProc( "notepad teste.txt", .F. )

wait "Quando chegar aqui o notepad ainda estara rodando. Tecle ENTER..."

? "Retorno:", myRunProc( "notepad teste.txt",, { |nCtd| qout( "Aguardando Notepad encerrar (" + hb_ntos(5-nCtd) + ")..." ) } ,, 5 )

wait "O Loop foi encerrado apos em 5 segundos..."

? "Retorno:", myRunProc( "notepad teste.txt",, { |nCtd|
                                                 qout( "Forcando o encerramento do Notepad atraves do retorno do codeblock..." )
                                                 return iif( nCtd = 2, .F., .T. )
                                               } )

wait "O Loop foi encerrado..."

return NIL

/*
  Parametros: cExecute - Comando a ser executado.
              lWait    - Se é para o executor aguardar o encerramento do processo iniciado.
              bBlock   - Bloco que será executado enquanto o processo estiver sendo executado.
              nTime    - De quanto em quanto tempo será verificado se o processo já terminou.
              nOccurs  - Encerra o loop de espera após X vezes que o loop estiver processando.
*/

******************
function myRunProc( cExecute, lWait, bBlock, nTime, nOccurs )
******************

local hProcess, nResult, nCtd := 0, lRet

__DefaultNIL( @lWait, .T. )
__DefaultNIL( @nTime, 1 )
__DefaultNIL( @nOccurs, 0 )

hProcess := hb_processOpen( cExecute )

if hProcess != F_ERROR
   do while ( nResult := hb_processValue( hProcess, .F. ) ) == -1
      if !lWait
         exit
      endif
      nCtd += 1
      if hb_IsBlock( bBlock )
         lRet := eval( bBlock, nCtd )
         if hb_IsLogical( lRet ) .and. !lRet
            hb_processClose( hProcess, .T. )
            exit
         endif
      endif
      if nTime > 0
         hb_idleSleep( nTime )
      endif
      if nCtd = nOccurs
         hb_processClose( hProcess, .T. )
         exit
      endif
   enddo
endif

return nResult

// EOF //
Espero que gostem.

Qualquer opnião sobre melhoria da mesma ou correção será bem vinda.

Como uso harbour, não sei se irá rodar com xHarbour. Alguém poderia confirmar se roda no xHarbour também ?

Obrigado,

Rossine.
Rossine.

Harbour 3.4, MingW / Msvc, QT, Qt5xhb, GtQtc, DbfCdx, MySql/MariaDB.
Avatar do usuário
fladimir
Colaborador
Colaborador
Mensagens: 2445
Registrado em: 15 Nov 2006 20:21

Função extended do Run

Mensagem por fladimir »

Vlw Rossine obrigado por compartilhar...

[]´s
Sun Tzu há mais de três mil anos cita nas epígrafes de seu livro “A Arte da Guerra“:

“Concentre-se nos pontos fortes, reconheça as fraquezas, agarre as oportunidades e proteja-se contra as ameaças”.
“Se não é vantajoso, nunca envie suas tropas; se não lhe rende ganhos, nunca utilize seus homens; se não é uma situação perigosa, nunca lute uma batalha precipitada”
.


Até 2017    Desktop Console [ Legado ] Harbour | MinGW | DBF | CDX | FastReport | MySQL


Novos Projetos:

   Desktop Visual           Windev Desktop
   Celular Android/iOS   Windev Mobile
   WEB                            Windev Web


Sejamos gratos a Deus.
lugab
Colaborador
Colaborador
Mensagens: 843
Registrado em: 19 Mai 2009 15:58

Função extended do Run

Mensagem por lugab »

Tb gostei, Rossine... Vc é um exemplo de desprendimento...

Parabéns e obrigado
lugab
rossine
Usuário Nível 3
Usuário Nível 3
Mensagens: 325
Registrado em: 06 Ago 2007 09:57
Localização: Divinópolis-MG

Função extended do Run

Mensagem por rossine »

Olá pessoal,

Implementei nesta função um TRACE do que está ocorrendo.

Exemplo de uso:

Código: Selecionar todos

/*

  Exemplo de uso da função MyRunProc

  By Rossine

*/

#include "fileio.ch"

#define CRLF chr(13) + chr(10)

function Main

set date to BRITISH

cls

myRunProc( "notepad.exe",,,, 5, "arquivo.log" )  // Aguarda 5 segundos antes de terminar o processo  e gera o ARQUIVO.LOG

return NIL


/*
  PARÂMETROS: cExecute - Comando a ser executado.
              lWait    - Se é para o executor aguardar o encerramento do processo iniciado.
              bBlock   - Bloco que será executado enquanto o processo estiver sendo executado.
              nTime    - De quanto em quanto tempo será verificado se o processo já terminou.
              nOccurs  - Encerra o loop de espera após X vezes que o loop estiver processando.
              cArqLog  - Nome do arquivo de LOG que será gerado.

  EXEMPLO:

              ? "Retorno:", myRunProc( "notepad teste.txt", .T., { || qout( "Aguardando Notepad encerrar..." ) }, 1 )
              
              wait "Quando chegar aqui o notepad ja foi encerrado. Tecle ENTER..."
              
              ? "Retorno:", myRunProc( "notepad teste.txt", .F. )
              
              wait "Quando chegar aqui o notepad ainda estara rodando. Tecle ENTER..."
              
              ? "Retorno:", myRunProc( "notepad teste.txt",, { |nCtd| qout( "Aguardando Notepad encerrar (" + hb_ntos(5-nCtd) + ")..." ) } ,, 5 )
              
              wait "O Loop foi encerrado apos 5 segundos..."
              
              ? "Retorno:", myRunProc( "notepad teste.txt",, { |nCtd|
                                                               qout( "Forcando o encerramento do Notepad atraves do retorno do codeblock..." )
                                                               return iif( nCtd = 2, .F., .T. )
                                                             } )
*/

******************
function myRunProc( cExecute, lWait, bBlock, nTime, nOccurs, cArqLog )
******************

local hProcess, nResult, nCtd := 0, lRet, lLog, cLog := ""
local hStdIn, hStdOut, hStdErr, lDetach, hPid

__DefaultNIL( @lWait, .T. )
__DefaultNIL( @nTime, 1 )
__DefaultNIL( @nOccurs, 0 )
__DefaultNIL( @cArqLog, "" )

lLog := iif( empty( cArqLog ), .F., .T. )

if lLog
   cLog += dtoc(date()) + "-" + time() + "-Iniciando execução do processo:[" + cExecute + "]..." + CRLF
endif

hProcess := hb_processOpen( cExecute, @hStdIn, @hStdOut, @hStdErr, lDetach, @hPid )

if hProcess != F_ERROR
   if lLog
      cLog += dtoc(date()) + "-" + time() + "-Processo iniciado. Executando Loop do processo..." + CRLF
   endif
   do while ( nResult := hb_processValue( hProcess, .F. ) ) == -1
      if !lWait
         exit
      endif
      nCtd += 1
      if lLog
         cLog += dtoc(date()) + "-" + time() + "-Executando Loop <" + hb_ntos(nCtd) + "/" + hb_ntos(nOccurs) + ">..." + CRLF
      endif
      if hb_IsBlock( bBlock )
         lRet := eval( bBlock, nCtd, hProcess, nResult, hPid )
         if hb_IsLogical( lRet ) .and. !lRet
            hb_processClose( hProcess, .T. )
            if lLog
               cLog += dtoc(date()) + "-" + time() + "-Processo finalizado pela execução do bloco de código. <<< Processo Abortado >>>" + CRLF
            endif
            exit
         endif
      endif
      if nTime > 0
         hb_idleSleep( nTime )
      endif
      if nCtd = nOccurs
         hb_processClose( hProcess, .T. )
         if lLog
            cLog += dtoc(date()) + "-" + time() + "-Processo finalizado pelo número de ocorrências. <<< Processo Abortado >>>" + CRLF
         endif
         exit
      endif
   enddo
endif

if lLog
   cLog += dtoc(date()) + "-" + time() + "-Final de execução do processo..." + CRLF
   hb_memowrit( cArqLog, cLog )
endif

return nResult

O exemplo acima vai gerar o arquivo.log com este conteúdo:

Código: Selecionar todos

20/06/14-10:27:21-Iniciando execução do processo:[notepad.exe]...
20/06/14-10:27:21-Processo iniciado. Executando Loop do processo...
20/06/14-10:27:21-Executando Loop <1/10>...
20/06/14-10:27:22-Executando Loop <2/10>...
20/06/14-10:27:23-Executando Loop <3/10>...
20/06/14-10:27:24-Executando Loop <4/10>...
20/06/14-10:27:25-Executando Loop <5/10>...
20/06/14-10:27:26-Executando Loop <6/10>...
20/06/14-10:27:27-Executando Loop <7/10>...
20/06/14-10:27:28-Executando Loop <8/10>...
20/06/14-10:27:29-Executando Loop <9/10>...
20/06/14-10:27:30-Executando Loop <10/10>...
20/06/14-10:27:31-Processo finalizado pelo número de ocorrências. <<< Processo Abortado >>>
20/06/14-10:27:31-Final de execução do processo...
Abraços,

Rossine.
Rossine.

Harbour 3.4, MingW / Msvc, QT, Qt5xhb, GtQtc, DbfCdx, MySql/MariaDB.
Avatar do usuário
billy1943
Usuário Nível 4
Usuário Nível 4
Mensagens: 570
Registrado em: 12 Mai 2009 17:33
Localização: Bauru-SP

Função extended do Run

Mensagem por billy1943 »

Como um os incontáveis "Clippeiros" que participamos deste Fórum, gostaria de saber se a rotina desenvolvida acima, em XHarbour/Harbour, teria como ser
passada para Clipper puro.

Isto porque, quando temos de rodar uma rotina externa ao Clipper, temos de por um "breque" enquanto a mesma não for finalizada no Windows.

Se positivo, informar qual a função HB_ ???? que teria de ser desenvolvida para que funcione de forma similar.
O bom do computador é que ele resolve os problemas, sem nunca levantar nenhum.
Hoje atuo mais com Clipper 52E, e um pouquinho com XHarbour.
rossine
Usuário Nível 3
Usuário Nível 3
Mensagens: 325
Registrado em: 06 Ago 2007 09:57
Localização: Divinópolis-MG

Função extended do Run

Mensagem por rossine »

Olá Billy,

Uma maneira disto poder funcionar é você criar um .EXE feito em harbour e apartir do teu aplicativo clipper, chamar este .EXE através do comando RUN.

O comando em si a ser executado poderia ser passado através de um arquivo .txt.

Exemplo:

Aplicativo clipper:

Código: Selecionar todos

memowrit( "exec.txt", "notepad.exe teste.log" )

run myrunex.exe

cResp := memoread( "resp.txt" )  // Aqui você pegaria o retorno da execução do myrunex.exe para ser tratado.

Aplicativo myrunex.prg

Código: Selecionar todos


cCmd :=memoread( "exec.txt" )

nResult := myRunProc( memoread( "exec.txt" ),,,, 5, "arquivo.log" )  // Aguarda 5 segundos antes de terminar o processo  e gera o ARQUIVO.LOG

memowrit( "resp.txt", hb_ntos(nResult) )

T+

Rossine.
Rossine.

Harbour 3.4, MingW / Msvc, QT, Qt5xhb, GtQtc, DbfCdx, MySql/MariaDB.
Responder