Função WaitRUN para Harbour

Projeto [x]Harbour - Compilador de código aberto compatível com o Clipper.

Moderador: Moderadores

Avatar do usuário
Jairo Maia
Moderador
Moderador
Mensagens: 2785
Registrado em: 16 Ago 2010 13:46
Localização: Campinas-SP

Função WaitRUN para Harbour

Mensagem por Jairo Maia »

Colegas do fórum,

Após vários meses afastado do fórum (e das atividades), estou com vagar retomando minha rotina, e espero breve poder também ajudar quando possível.

Estou dando continuidade na migração de um sistema usando Harbour 3.0, e gostaria de saber em qual lib posso encontrar a função WAITRUN().

Procurando pela solução que preciso, encontrei neste fórum este tópico: https://pctoledo.org/forum/viewto ... it=waitrun

Nele, o colega Itamar disse haver esta função em outras libs além do FIVEWIN, inclusive para Harbour, mas não disse qual seria esta lib. Gostaria de saber se algum colega sabe qual lib em harbour posso encontrá-la.

Agradeço qualquer dica.
Abraços, Jairo
Harbour / Clipper 5.2e - Blinker 7
(Não respondo dúvidas por MP ou E-mail. Por favor, não encaminhe via mensagem privada ou e-mail, dúvidas que podem ser compartilhadas com todos no fórum)
Avatar do usuário
Itamar M. Lins Jr.
Administrador
Administrador
Mensagens: 7929
Registrado em: 30 Mai 2007 11:31
Localização: Ilheus Bahia
Curtiu: 1 vez

Função WaitRUN para Harbour

Mensagem por Itamar M. Lins Jr. »

Ola!
* harbour/source/rtl/hbprocfn.c
+ added .prg function:
hb_processRun( <cCommand>, [ <cStdIn> ], [ @<cStdOut> ], ;
[ @<cStdErr> ], [ <lDetach> ] ) -> <nResult>
This function is implemented for all builds also in DOS ones where
temporary files are used to simulate pipes.
TODO: in OS2 builds it should be possible to implement this function
without temporary files just like in *nixes and MS-Windows builds.
I would like to ask OS2 users to make it.
Outra função para abrir html,etc...

Código: Selecionar todos

****************************
Function mRun(cComando,lFlag)
****************************
*
*
Local oShell,lRet
lFlag := if( lFlag = NIL, .F., lFlag )

oShell:=Win_OleCreateObject("WScript.Shell")
lRet  :=oShell:Run("%ComSpec% /c " + cComando, 0, lFlag)
oShell:=Nil

Return iif(lRet=0,.t.,.f.)
Saudações,
Itamar M. Lins Jr.
Saudações,
Itamar M. Lins Jr.
Avatar do usuário
Jairo Maia
Moderador
Moderador
Mensagens: 2785
Registrado em: 16 Ago 2010 13:46
Localização: Campinas-SP

Função WaitRUN para Harbour

Mensagem por Jairo Maia »

Olá Itamar,

Obrigado por sua resposta.

A função hb_processRun() não consegui usar. O comando é executado, mas aparece a janela preta do DOS, e não fica legal. Pesquisei para entender os parâmetros, e não encontrei.

A segunda função que vc passou, é idêntica a que o Leonardo havia postado no link que citei, e que eu não havia conseguido sucesso antes. Ocorre que hoje, após sua postagem, resolvi insistir, e com uma pequena modificação na minha função TUDO funcionou CORRETAMENTE, incluido retorno de erro (que provoquei), e emitir a mensagem de insucesso.

Obrigado a todos,
Problema Resolvido!
Abraços, Jairo
Harbour / Clipper 5.2e - Blinker 7
(Não respondo dúvidas por MP ou E-mail. Por favor, não encaminhe via mensagem privada ou e-mail, dúvidas que podem ser compartilhadas com todos no fórum)
Thon Melo
Usuário Nível 1
Usuário Nível 1
Mensagens: 2
Registrado em: 09 Mar 2012 16:35
Localização: Fortaleza/Ce

Função WaitRUN para Harbour

Mensagem por Thon Melo »

Aproveitando o tópico gostaria de saber como faço para converter os comandos abaixo para Harbour

Código: Selecionar todos

!copy CDPABX.LOG+CDPABX.LXX CDPABX.LOG >NUL
!del CDPABX.LXX >NUL
no Clipper funcionava beleza depois que converti par harbour em modo console não funciona mais. Uso esse comando para manter um arquivo de log sempre atualizado. A cada execução coleto os dados de um PABX via porta serial e coloco em um arquivo temporário cdpabx.lxx depois pegava o arquivo de log antigo e acrescentava o arquivo novo ao final dele e depois apagava o arquivo temporário. alguém pode me dar uma idéia de como fazer isso com o harbour? Já tentei com waitRun() e com MYRUN() mas não dar certo apresenta um erro e o programa fecha não dar para ler qual é o erro.
Obrigado

Thon Melo
Avatar do usuário
asimoes
Colaborador
Colaborador
Mensagens: 4919
Registrado em: 26 Abr 2007 16:48
Localização: RIO DE JANEIRO-RJ

Função WaitRUN para Harbour

Mensagem por asimoes »

Tente isso:
MyRun("CDPABX.LOG+CDPABX.LXX CDPABX.LOG")

FErase("CDPABX.LXX")

Ou

MyRun("DEL CDPABX.LXX")

Código: Selecionar todos

#include "hbcompat.ch"
FUNCTION MYRUN( cComando )
LOCAL oShell, lOk:=.T.
   TRY
      oShell:=CreateObject( "WScript.Shell" )
   CATCH
      TRY
         oShell:=CreateObject( "WScript.Shell" )
      CATCH
         lOk:=.F.
      END
   END
   IF lOk
      TRY
        oShell:Run( "%comspec% /c " + cComando, 0, .T. )
      CATCH
         lOk:=.F.
      END
      oShell:=Nil
   ENDIF
RETURN lOk
►Harbour 3.x | Minigui xx-x | HwGui◄
Pense nas possibilidades abstraia as dificuldades.
Não corrigir nossas falhas é o mesmo que cometer novos erros.
A imaginação é mais importante que o conhecimento. (Albert Einstein)
Thon Melo
Usuário Nível 1
Usuário Nível 1
Mensagens: 2
Registrado em: 09 Mar 2012 16:35
Localização: Fortaleza/Ce

Função WaitRUN para Harbour

Mensagem por Thon Melo »

Obrigado asimoes
Deu certo só acrescentei assim:

MyRun("copy CDPABX.LOG+CDPABX.LXX CDPABX.LOG >NUL")
DELETE FILE("CDPABX.LXX")

Uma das mensagem de erro que aparecia era que o arquivo esta sendo utilizado por outro processo. Percebi que não tinha fechado o arquivo com o comando SET PRINTER TO.

Valeu ...
Avatar do usuário
asimoes
Colaborador
Colaborador
Mensagens: 4919
Registrado em: 26 Abr 2007 16:48
Localização: RIO DE JANEIRO-RJ

Função WaitRUN para Harbour

Mensagem por asimoes »

Ih, esqueci do COPY, ainda bem que funcionou.
►Harbour 3.x | Minigui xx-x | HwGui◄
Pense nas possibilidades abstraia as dificuldades.
Não corrigir nossas falhas é o mesmo que cometer novos erros.
A imaginação é mais importante que o conhecimento. (Albert Einstein)
Abel
Usuário Nível 3
Usuário Nível 3
Mensagens: 332
Registrado em: 14 Mar 2012 13:16
Localização: sao paulo / sp

Função WaitRUN para Harbour

Mensagem por Abel »

Ola, Jairo Maia,

tentei usar a funcao myrun() para executar programas externos eliminando a tela preta que "pisca", mas ainda nao consegui.

no meu caso da erro de compilacao,

undefined reference to hb_fun_createobject, será que tenho q incluir alguma lib ?
quais #includes vc esta usando, vale dizer que estou usando harbour 3.1

Abracos,
ABEL
Avatar do usuário
sygecom
Administrador
Administrador
Mensagens: 7131
Registrado em: 21 Jul 2006 10:12
Localização: Alvorada-RS
Contato:

Função WaitRUN para Harbour

Mensagem por sygecom »

viewtopic.php?f=4&t=13108
Leonardo Machado
xHarbour.org + Hwgui + PostgreSql
Abel
Usuário Nível 3
Usuário Nível 3
Mensagens: 332
Registrado em: 14 Mar 2012 13:16
Localização: sao paulo / sp

Função WaitRUN para Harbour

Mensagem por Abel »

funcionou acrescentando na compilacao

-lxhb
-lhbwin

function myrun()

agora nao pisca mais a tela preta.

Abracos e valeu pelas dicas ...
Abel
Abel
Usuário Nível 3
Usuário Nível 3
Mensagens: 332
Registrado em: 14 Mar 2012 13:16
Localização: sao paulo / sp

Função WaitRUN para Harbour

Mensagem por Abel »

Ola pessoal,

apos conseguir utilizar o comando myrun e evitar a tela preta e piscava com a ajuda de voces, preciso novamente de mais um empurranzinho, quando a execucao de programas externos pelo harbour.

tenho em uma das minhas rotinas o seguinte:

MYRUN("ARJ.EXE A -VA -R BACKUP *.DBF *.MEM *.TXT")

O que ocorre é que ao executar este comando utilizando o myrun, ele nao exibe o andamento da compactacao para
que o cliente veja alguma mensagem de erro., vale dizer que ele executa perfeitamente o comando mas eu nao
vejo o andamamento.

seria possivel executar um programa externo msdos e ver o andamento, uma vez que estou compilando com os parametros -GUI e meu sistema era modo console totalmente procedural ?

Agradeco antecipadamente...
ABEL
Imatech
Usuário Nível 3
Usuário Nível 3
Mensagens: 350
Registrado em: 24 Ago 2010 23:48
Localização: Goiânia-GO

Função WaitRUN para Harbour

Mensagem por Imatech »

.
Para esse caso: voltar ao: HB_RUN ( sCMD )
.

Código: Selecionar todos


sCMD := "ARJ.EXE A -VA -R BACKUP *.DBF *.MEM *.TXT"

HB_RUN ( sCMD )

M., Ronaldo

by: IMATECH

IMATION TECNOLOGIA
Abel
Usuário Nível 3
Usuário Nível 3
Mensagens: 332
Registrado em: 14 Mar 2012 13:16
Localização: sao paulo / sp

Função WaitRUN para Harbour

Mensagem por Abel »

jovemxxx,
me diz uma coisa, usei o hb_run e rodou perfeitamente (arj), mas abriu uma outra janela msdos executou e depois fechou.

é assim mesmo ? na janela do meu sistema q agora esta compilado com -gui nao tem como apresentar o andamento da compactacao ?

Abracos,
ABEL
Avatar do usuário
Pablo César
Usuário Nível 7
Usuário Nível 7
Mensagens: 5312
Registrado em: 31 Mai 2006 10:22
Localização: Curitiba - Paraná

Função WaitRUN para Harbour

Mensagem por Pablo César »

Abel você pode usar a função do Harbou HB_ZipFileCreate nela tem um parâmetro que você coloca o nome da função que serve para controlar o andamento do zipar e unzipar. Eu não encontrei exemplo em modo console para te mostrar, mas aqui tem um em Minigui que você pode adaptar:

Código: Selecionar todos

#command COMPRESS [ FILES ] <afiles> ;
		TO <zipfile> ;
		BLOCK <block>  ;
		[ <ovr: OVERWRITE> ] ;
		[ <srp: STOREPATH> ] ;
		[ PASSWORD <password> ] ;
=> ;
	COMPRESSFILES ( <zipfile> , <afiles>, <block> , <.ovr.> , <.srp.> , <password> )

Function Main
// chama as funções para zipar e unzipar
Return Nil


#command UNCOMPRESS [ FILE ] <zipfile> ;
		[ BLOCK <block> ] ;
		[ PASSWORD <password> ] ;
=> ;
	UNCOMPRESSFILES ( <zipfile> , <block> , <password> )


*------------------------------------------------------------------------------*
Function CreateZip()
*------------------------------------------------------------------------------*
Local aDir := Directory( "f*.txt", "D" ), aFiles:= {}, nLen
Local cPath := CurDrive()+":\"+CurDir()+"\"

FillFiles( aFiles, aDir, cPath )

if ( nLen := Len(aFiles) ) > 0
	Form_1.ProgressBar_1.RangeMin := 1
	Form_1.ProgressBar_1.RangeMax := nLen
	MODIFY CONTROL Label_1 OF Form_1 FONTCOLOR {0,0,0}

	COMPRESS aFiles ;
		TO 'ZipTest.Zip' ;
		BLOCK {|cFile, nPos| ProgressUpdate( nPos, cFile, .T. ) } ;
		PASSWORD "mypass" ;
		OVERWRITE

	MODIFY CONTROL Label_1 OF Form_1 FONTCOLOR {0,0,255}
	Form_1.Label_1.Value := 'Backup is finished'
endif

Return Nil

*------------------------------------------------------------------------------*
Function ProgressUpdate( nPos , cFile , lShowFileName )
*------------------------------------------------------------------------------*

	Default lShowFileName := .F.

	Form_1.ProgressBar_1.Value := nPos
	Form_1.Label_1.Value := cFileNoPath( cFile )

	if lShowFileName
		INKEY(.2)
	endif

Return Nil

*------------------------------------------------------------------------------*
Function UnZip()
*------------------------------------------------------------------------------*
Local cCurDir := GetCurrentFolder(), cArchive

cArchive := Getfile ( { {'Zip Files','*.ZIP'} } , 'Open File' , cCurDir , .f. , .t. )

if !Empty(cArchive)
	Form_1.ProgressBar_1.RangeMin := 0
	Form_1.ProgressBar_1.RangeMax := GetFilesCountInZip( cArchive )
	MODIFY CONTROL Label_1 OF Form_1 FONTCOLOR {0,0,0}

	UNCOMPRESS cArchive ;
		BLOCK {|cFile, nPos| ProgressUpdate( nPos, cFile, .T. ) } ;
		PASSWORD "mypass"

	MODIFY CONTROL Label_1 OF Form_1 FONTCOLOR {0,0,255}
	Form_1.Label_1.Value := 'Restoration of Backup is finished'
endif

Return Nil

*------------------------------------------------------------------------------*
Function FillFiles( aFiles, cDir, cPath )
*------------------------------------------------------------------------------*
  Local aSubDir, cItem

  FOR cItem :=1 TO LEN(cDir)
    IF cDir[cItem][5] <> "D"
      AADD( aFiles, cPath+cDir[cItem][1] )
    ELSEIF cDir[cItem][1] <> "." .AND. cDir[cItem][1] <> ".."
      aSubDir := DIRECTORY( cPath+cDir[cItem][1]+"\*.*", "D" )
      aFiles:=FillFiles( aFiles, aSubdir, cPath+cDir[cItem][1]+"\" )
    ENDIF
  NEXT

Return aFiles

*------------------------------------------------------------------------------*
Function GETFILESCOUNTINZIP ( cFileName )
*------------------------------------------------------------------------------*
LOCAL i := 0 , hUnzip , nErr

	hUnzip := HB_UNZIPOPEN( cFileName )

	nErr := HB_UNZIPFILEFIRST( hUnzip )

	DO WHILE nErr == 0

		i++
		nErr := HB_UNZIPFILENEXT( hUnzip )

	ENDDO

	HB_UNZIPCLOSE( hUnzip )

Return i

*------------------------------------------------------------------------------*
PROCEDURE COMPRESSFILES ( cFileName , aDir , bBlock , lOvr , lStorePath , cPassword )
*------------------------------------------------------------------------------*
LOCAL hZip , cZipFile , i

	if valtype (lOvr) == 'L'
		if lOvr == .t.
			if file (cFileName)
				delete file (cFileName)
			endif
		endif
	endif

	hZip := HB_ZIPOPEN( cFileName )
	IF ! EMPTY( hZip )
		FOR i := 1 To Len (aDir)
			if valtype (bBlock) == 'B'
				Eval ( bBlock , aDir [i] , i )     
			endif
			cZipFile := if( lStorePath, aDir [i], cFileNoPath( aDir [i] ) )
			HB_ZipStoreFile( hZip, aDir [i], cZipFile, cPassword )
		NEXT
	ENDIF

	HB_ZIPCLOSE( hZip )

RETURN

*------------------------------------------------------------------------------*
PROCEDURE UNCOMPRESSFILES ( cFileName , bBlock , cPassword )
*------------------------------------------------------------------------------*
LOCAL i := 0 , hUnzip , nErr, cFile, dDate, cTime, nSize, nCompSize, lCrypted, cComment

	hUnzip := HB_UNZIPOPEN( cFileName )

	nErr := HB_UNZIPFILEFIRST( hUnzip )

	DO WHILE nErr == 0

		HB_UnzipFileInfo( hUnzip, @cFile, @dDate, @cTime,,,, @nSize, @nCompSize, @lCrypted, @cComment )

		if valtype (bBlock) == 'B'
			Eval ( bBlock , cFile , ++i )
		endif

		HB_UnzipExtractCurrentFile( hUnzip, NIL, cPassword )

		nErr := HB_UNZIPFILENEXT( hUnzip )

	ENDDO

	HB_UNZIPCLOSE( hUnzip )

RETURN
O exemplo completo em GUI você pode ver em: C:\MiniGUI\SAMPLES\BASIC\Zip_3\demo.prg
Um clip-abraço !

Pablo César Arrascaeta
Compartilhe suas dúvidas e soluções com todos os colegas aqui do fórum.
Evite enviar as dúvidas técnicas por MPs ou eMails, assim todos iremos beneficiar-nos.
Abel
Usuário Nível 3
Usuário Nível 3
Mensagens: 332
Registrado em: 14 Mar 2012 13:16
Localização: sao paulo / sp

Função WaitRUN para Harbour

Mensagem por Abel »

valeu, vou dar uma pesquisada nisso,
ja que estou fazendo uma faxina no meu sistema, decidi fazer por completo..rs

Abracos, e desde ja agradeco mais uma vez.
Responder