Página 2 de 3
Função WaitRUN para Harbour
Enviado: 21 Jun 2012 21:04
por JoséQuintas
Estou tendo problemas com o RUN.
Já testei SwpRunCmd(), Run, HB_Run() e HB_ProcessRun()
Problema: Tudo bem, o programa aguarda a execução do que foi chamado, mas não se pode mexer na tela, senão o Windows acusa "este programa não está respondendo", porque fica travado.
Existe alguma solução pra isso no Harbour?
Obs.
Utilizei a saída para o DOS como teste, run (GetEnv("COMSPEC"))
E no HB_ProcessRun() não há espera e nem janela aberta
Função WaitRUN para Harbour
Enviado: 21 Jun 2012 21:12
por Pablo César
Oi Jo´se, você já viu o exemplo postado pelo Leonardo ?
https://pctoledo.org/forum/viewto ... ell#p75529
Função WaitRUN para Harbour
Enviado: 21 Jun 2012 22:50
por Abel
tive este problema e era um terminal, toda hora aparecia "nao esta respondendo" na barra de titulo.
abri uma janela msdos,
fiz um ping <nome do servidor> -t e vi que perdia varios pacotes...., ai pedi para o cliente chamar alguem para verificar a rede.
as vezes ainda aparece "nao esta respondendo", mas é so clicar na janela, que volta tudo ao normal.
Abel
Função WaitRUN para Harbour
Enviado: 21 Jun 2012 23:53
por Pablo César
Isso aí Abel, valeu pelo seu esclarecimento. Isso é algo que as vezes não prestamos atenção. Bem lembrado !
Função WaitRUN para Harbour
Enviado: 22 Jun 2012 11:02
por JoséQuintas
Também não deu certo.
A execução funciona, mas o programa fica travado esperando resposta.
No Windows existe um limite de tempo para um programa responder, e não pode ficar a espera de outro indefinidamente.
Aqui um protótipo de uma idéia, mas ainda vou pesquisar como fazer, pra ver se o resultado prático é o mesmo teórico.
Obs. Em console não existe esse limite, só em GUI
Código: Selecionar todos
Terminou := .f.
MultiThreat {|| outroRun("cmd.exe")}
do while .not. terminou
Inkey(3)
enddo
function outrorun(comando)
run (comando)
terminou := .t.
return NIL
Função WaitRUN para Harbour
Enviado: 22 Jun 2012 11:54
por asimoes
Para ajudar:
lOk:=MyRun( "Teste.pdf" )
Código: Selecionar todos
FUNCTION MYRUN( cComando )
LOCAL oShell, lOk:=.T.
/*
O WScript.WSHShell
O WSHShell é um objeto que permite acesso direto ao shell do Windows. Ele possui métodos e propriedades básicas para a criação de qualquer script,
como executar programas, modificar o registro, gerar eventos no log de eventos do computador, entre outros.
Para se familiarizar com o conteúdo que veremos adiante, recomendo que leia as informações sobre os métodos e propriedades do objeto WSHShell no link abaixo:
http://msdn.microsoft.com/library/en-us/script56/html/wsoriWshShellObjectPropMeth.asp
Imagine a seguinte situação: você é um administrador que precisa criar um script de logon, de forma que um programa seja executado sempre após o logon do usuário.
Vamos analisar este problema.
Uma das formas de resolver tal problema é criar um script que carrega um programa e atribuir como script de logon dos usuários, seja nas propriedades dele
no AD ou por uma GPO.
Veja o script abaixo:
Set objShell = CreateObject("Wscript.Shell")
objShell.Run "\\server\share\programa.exe"
O script acima resolve o problema. No entanto, ele possui um problema: ele executa o aplicativo em primeiro plano, e todas as informações são exibidas na tela,
o que costuma confundir os usuários. Outro detalhe é que o script apenas é chama o programa e continua sendo executado.
Em algumas situações, pode ser necessário executar o programa e somente depois dele ter terminado continuar o script.
Esses dois problemas podem ser resolvidos modificando um pouco o script. Veja:
Set objShell = CreateObject("Wscript.Shell")
objShell.Run "\\server\share\programa.exe",0,true
Foram adicionados dois parâmetros ao método Run, separados por vírgula. O primeiro parâmetro, um zero, abre o programa como uma janela escondida.
O segundo parâmetro, true, faz com que o script espere até o programa ser terminado. Esses e outros parâmetros estão no seguinte link:
http://msdn.microsoft.com/library/en-us/script56/html/wsoriWshShellObjectPropMeth.asp
A vantagem de usar um script assim é a manutenção fácil. Caso o programa precise ser alterado, ou mesmo mais um programa precise ser executado,
fica fácil alterar o sistema. Este script ainda pode ser melhorado. Uma primeira idéia seria fazer ele listar os programas em uma determinada pasta
no servidor e executar todos. Assim, bastaria incluir um programa novo lá que automaticamente todos os usuários executariam o programa durante o logon.
*/
TRY
oShell:=Win_OleCreateObject( "WScript.Shell" )
CATCH
TRY
oShell:=Win_OleCreateObject( "WScript.Shell" )
CATCH
lOk:=.F.
END
END
IF lOk
//oTeste:=oShell:Exec("calc")
//DO WHILE oTeste:Status = 0
// HB_IDLESLEEP( 1 )
//ENDDO
//btn = oShell:Popup("Testar Sim ou Não?", 7, "Questão:", 4 + 32)
//Alert(Str(btn))
//Alert(oShell:CurrentDirectory)
TRY
oShell:Run( "%comspec% /c " + cComando, 0, .T. ) //.F. = NÆo espera a aplica‡Æo fechar, .T. espera.
CATCH
lOk:=.F.
END
oShell:=Nil
ENDIF
RETURN lOk
Função WaitRUN para Harbour
Enviado: 22 Jun 2012 12:22
por JoséQuintas
Com isso o programa não dá o travamento windows, mas não abriu o prompt, e precisou ser fechado pelo gerenciador de tarefas.
E ao que parece, o cmd.exe chamado ficou zumbi no gerenciador de tarefas também.
Vou pesquisar mais depois, incluindo as opções do script que tem aí, e aquele protótipo que coloquei usando multithreat.
Função WaitRUN para Harbour
Enviado: 22 Jun 2012 14:01
por JoséQuintas
Não consegui encontrar referência do multithread.
No google, a palavra Harbour acaba desviando pra tudo que se refere à universidade americana.
Queria testar colocar o run em multithread porque talvez resolva meu problema.
Só rodar o run em multithread e checar quando termina.
Até achei um blog que mostra detalhes das funções, mas sem exemplo prático.
Função WaitRUN para Harbour
Enviado: 22 Jun 2012 16:39
por asimoes
José,
No seu script de compilação acrescente a instrução:
-mt
Na pasta C:\Projetos_SVN\harbour\contrib\gtwvg\tests você vai encontrar um exemplo com multithreat, veja a procedure do fonte demowvg.prg
Código: Selecionar todos
PROCEDURE WvtConsoleGets( nMode )
DEFAULT nMode TO 0
IF hb_mtvm()
Hb_ThreadStart( {|oCrt| hb_gtReload( 'WVT' ) , ;
oCrt := hb_gtSelect(), ;
iif( nMode == 0, WvtNextGetsConsole(), GoogleMap() ) , ;
oCrt := NIL } )
ENDIF
RETURN
Função WaitRUN para Harbour
Enviado: 22 Jun 2012 17:06
por JoséQuintas
Aqui deu certo, mas a comunicação com a thread foi via arquivo.
Tentei até com variável pública, mas não foi.
Código: Selecionar todos
Procedure Main
@ 1, 0 Say "começou"
cComando := "cmd.exe"
RunWait(cComando)
@ 2, 0 Say "Parou"
Inkey(100)
Return
Function RunWait(cComando)
HB_MemoWrit("teste.txt","teste")
Hb_ThreadStart( {||OutroRun(cComando)} )
nCont := 1
Do While File("teste.txt")
? nCont
nCont += 1
Inkey(1)
Enddo
Return NIL
Function OutroRun(cComando)
Run(cComando)
fErase("teste.txt")
Return NIL
Função WaitRUN para Harbour
Enviado: 27 Jun 2012 00:17
por Abel
Jose, segue minha rotina, mande exemplos do que vc esta querendo executar para gente ver se consegue te ajudar.
abracos,
Código: Selecionar todos
FUNCTION MYRUN(cComando, rL_ESPERA)
local oShell, RET
IF rL_ESPERA=NIL
rL_ESPERA=.T. // rL_ESPERA = .F. SO DEVOLVE O CONTROLE P/SISTEMA QDO TERMINAR EXECUCAO
ENDIF // rL_ESPERA = .T. DEVOLVE O CONTROLE AO SISTEMA MESMO SE O PROGRAMA CHAMADO AINDA ESTIVER SENDO EXECUTADO
oShell := CreateObject("WScript.Shell")
RET:=oShell:Run("%comspec% /c "+cComando,0, rL_ESPERA)
oShell:=NIL
RETURN IIF(RET=0,.t.,.f.)
com ela alterei praticamente todos os pontos que o sistema tinha uma chamada externa.
faz um teste simples
myrun("notepad.exe",.t.) // ele trava o programa q chamou ate fechar o notepad
myrun("notepad,exe",.f.) // ele abre o notepad e fica os dois programas funcionando separadamente.
um site eu abro assim:
myrun("cmd /c start /max http://www......com.br",.f.)
myrun("executa.exe",.f.) // executa e libera o processamento mesmo se o mesmo estiver aberto.
Função WaitRUN para Harbour
Enviado: 27 Jun 2012 01:54
por JoséQuintas
Já passaram no grupo no Harbour.
Hb_ThreadStart( @OutroRun(), cComando )
or
Hb_ThreadStart( {| cVar |OutroRun(cVar)}, cComando )
Em janela Windows não GUI, tipo GTWVT ou GTWVW, a janela não pode esperar indefinidamente pela resposta do outro programa.
O Windows considera isso como programa travado.
A alternativa é a rotina do run estar em uma thread separada, e essa thread pode ficar aguardando resposta, sem travar a que está chamando.
Uma das situações, por exemplo, é:
chamo um programa pra gerar o PDF, e preciso aguardar que o PDF seja gerado antes de prosseguir.
Em console tudo ok, mas se usar GUI, só a alternativa acima.
Função WaitRUN para Harbour
Enviado: 29 Jun 2012 23:04
por Abel
pessoal, estou usando o comando hb_run("arj t -va -r backup.arj") para que o sistema compilado com -gui,
abra uma nova janela msdos e execute o arj dentro dela., este comando é para testar o arquivo backup.arj
o que ocorre é que abre a segunda janela mas roda tao rapido e ao terminar a janela ela fecha e nem consegui ver o que foi processado.
será que é possivel executar o comando e pausar a janela msdos que foi aberta peo hb_run antes da mesma fechar ?
Abracos,
ABEL
Função WaitRUN para Harbour
Enviado: 30 Jun 2012 00:09
por Pablo César
Uma ideia seria direcionar o comando para arquivo e depois ler-lo.
Função WaitRUN para Harbour
Enviado: 04 Jul 2012 14:05
por JoséQuintas
Só pra acrescentar mais opções...
Tava olhando o help do start do Windows:
"Titulo" - Titulo pra janela
/d Path - Path de trabalho
/min /max - minimizado ou maximizado
/wait - aguardar o término
Então, comportamento diferente para:
Start /wait programa.exe
Start programa.exe
Achei interessante a opção do título, e em alguns casos, rodar minimizado.
Start "Sub-rotina XXXXX" /min programa.exe
Aqui usando Windows 7. Não sei isso está disponível em outras versões.