Página 1 de 1

Função extended do Run

Enviado: 06 Mai 2014 16:00
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.

Função extended do Run

Enviado: 07 Mai 2014 00:01
por fladimir
Vlw Rossine obrigado por compartilhar...

[]´s

Função extended do Run

Enviado: 07 Mai 2014 13:34
por lugab
Tb gostei, Rossine... Vc é um exemplo de desprendimento...

Parabéns e obrigado

Função extended do Run

Enviado: 20 Jun 2014 10:35
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.

Função extended do Run

Enviado: 23 Jun 2014 10:11
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.

Função extended do Run

Enviado: 23 Jun 2014 11:37
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.