FiveTech Support Forums

FiveWin / Harbour / xBase community
Board index FiveWin para Harbour/xHarbour Waitrun y Timer
Posts: 711
Joined: Thu Oct 06, 2005 09:57 PM
Waitrun y Timer
Posted: Sun Nov 29, 2009 08:21 AM

En una aplicaci贸n, periodicamente el usuario se conecta a un dispositivo externo, a traves de otra aplicaci贸n en JAVA.

Para esta conexi贸n, uso la siguiente instrucci贸n que funciona perfectamente. Mientras esta funcionando JAVA (oculto)
se mantiene la pantallita del MSgRun:

MsgRun ( cM[48], , {|oDlg1| WaitRun(cFile, 0) })

cFile es una llamada a un fichero bat con diferentes par谩metros.

La cuesti贸n es que a veces, la conexi贸n dura varios segundos y algunos usuarios son impacientes. Por ello he preparado otra funci贸n, donde mientras se ejecuta ocultamente la aplicaci贸n JAVA, aparece una pantallita con un TIMER.
El problema es que solo funciona correctamente cuando pulso el bot贸n CONECTAR y me gustaria que lo hiciera automaticamente, pero no lo consigo. He puesto en el ON INIT un codeblock, pero no marcha.

Este es el c贸digo de la funci贸n:

static function fTimer( cFile )

local oDlg, oProg, oTmr

DEFINE DIALOG oDlg TITLE "Conexi贸n dispositivo"
@ 1, 3 PROGRESS oProg POSITION 0 SIZE 120, 10
@ 2.5, 10 BUTTON "Conectar" ACTION (WaitRun( cFile, 0 ),oDlg:End()) // solo funciona cuando pulso AQUI
ACTIVATE DIALOG oDlg CENTER ;
ON INIT (oProg:SetRange( 1,995 ), Timer( oDlg, oProg, oTmr ), {|oDlg| WaitRun(cFile, 0) } )

RELEASE TIMER oTmr

return nil

// funcion auxiliar
static function Timer( oDlg, oProg, oTmr )

  DEFINE TIMER oTmr INTERVAL 100 ;
     ACTION ( oProg:nPosition += 5,  ;
         If( oProg:nPosition > 1000, oProg:nPosition:=0,)) OF oDlg

  ACTIVATE TIMER oTmr

return nil

//////////////////////////////

驴Alguna idea?. Seria bueno, en mi opini贸n, que WAITRUN() contara, automaticamente con un TIMER.

Un saludo



Manuel
Posts: 44162
Joined: Thu Oct 06, 2005 05:47 PM
Re: Waitrun y Timer
Posted: Sun Nov 29, 2009 11:16 AM

Manuel,

Revisa el uso de oDlg:bStart en ejemplos como FWH\samples\Progres1.prg 贸 en el mismo c贸digo fuente de MsgRun() en FWH\source\function\msgrun.prg

regards, saludos

Antonio Linares
www.fivetechsoft.com
Posts: 711
Joined: Thu Oct 06, 2005 09:57 PM
Re: Waitrun y Timer
Posted: Sun Nov 29, 2009 05:26 PM
Antonio Linares wrote:Manuel,

Revisa el uso de oDlg:bStart en ejemplos como FWH\samples\Progres1.prg 贸 en el mismo c贸digo fuente de MsgRun() en FWH\source\function\msgrun.prg


Antonio, muchas gracias. He revisado el c贸digo de la siguiente manera:

static function fTimer( cMsg, bAction, nInterval )
local oDlg, oProg, oTmr

DEFINE DIALOG oDlg TITLE cMsg
@ 2, 3 PROGRESS oProg POSITION 0 SIZE 120, 10
oDlg:bStart = { || WaitRun(bAction, 0), oDlg:End(), SysRefresh() }
oDlg:lHelpIcon:=.f.
ACTIVATE DIALOG oDlg CENTER ;
ON INIT (oProg:SetRange( 1,995 ), Timer( oDlg, oProg, oTmr, nInterval ) )
RELEASE TIMER oTmr
return nil

static function Timer( oDlg, oProg, oTmr, nInterval )
DEFINE TIMER oTmr INTERVAL nInterval ;
ACTION ( oProg:nPosition += 5, ;
If( oProg:nPosition > 1000, oProg:nPosition:=0,)) OF oDlg
ACTIVATE TIMER oTmr
return nil
------------------------------------------------------------------------------------
Ahora funciona el Timer y la aplicaci贸n externa correctamente. Pero cuando termina y vuelve a la funci贸n que lo habia llamado, esta tiene un alert condicionado, antes de return y no hace nada. Creo que al realizar la llamada a la funci贸n fTimer, no espera y continua hasta el Return. En cambio cuando utilizaba la otra alternativa:

MsgRun ( cM[48], , {|oDlg1| WaitRun(bAction, 0) })

el programa si espera la finalizacion del WaitRun.

Me imagino que habr铆a que poner algo en la funcion que llama a Ftimer() para que hasta que finalice esta funci貌n no continue con la siguiente linea. Lo he intentado con otro WaitRun, pero tampoco funciona. 驴Podrias ayudarme?
Un saludo



Manuel
Posts: 44162
Joined: Thu Oct 06, 2005 05:47 PM
Re: Waitrun y Timer
Posted: Sun Nov 29, 2009 07:07 PM
Manuel,

He hecho unos cambios m铆nimos a tu ejemplo y aqui va bien, salvo que quieras hacer otra cosa:

Code (fw): Select all Collapse
#include "FiveWin.ch"

function Main()

聽 聽fTimer( "probando", "calc.exe", 5 )
聽 聽
return nil
聽 聽
function fTimer( cMsg, cAction, nInterval )

聽 聽local oDlg, oProg, oTmr

聽 聽DEFINE DIALOG oDlg TITLE cMsg

聽 聽@ 2, 3 PROGRESS oProg POSITION 0 SIZE 120, 10

聽 聽oDlg:bStart = { || WaitRun( cAction, 0), oDlg:End(), SysRefresh() }
聽 聽oDlg:lHelpIcon = .F.
聽 聽
聽 聽ACTIVATE DIALOG oDlg CENTER ;
聽 聽 聽 ON INIT ( oProg:SetRange( 1,995 ), oTmr := Timer( oDlg, oProg, nInterval ) )

聽 聽oTmr:End()
聽 聽
return nil

static function Timer( oDlg, oProg, nInterval )

聽 聽local oTmr

聽 聽DEFINE TIMER oTmr INTERVAL nInterval ;
聽 聽 聽 ACTION ( oProg:nPosition += 5,;
聽 聽 聽 聽 聽 聽 聽 聽If( oProg:nPosition > 1000, oProg:nPosition:=0,) ) OF oDlg

聽 聽ACTIVATE TIMER oTmr

return oTmr
regards, saludos

Antonio Linares
www.fivetechsoft.com
Posts: 711
Joined: Thu Oct 06, 2005 09:57 PM
Re: Waitrun y Timer
Posted: Sun Nov 29, 2009 09:28 PM
Antonio Linares wrote:Manuel,
He hecho unos cambios m铆nimos a tu ejemplo y aqui va bien, salvo que quieras hacer otra cosa:


Antonio, "Cambios milagrosos". Ahora todo funciona perfectamente.

Muchas gracias por todo.
Un saludo



Manuel
Posts: 711
Joined: Thu Oct 06, 2005 09:57 PM
Re: Waitrun y Timer
Posted: Sat Feb 20, 2010 03:17 PM

Antonio, vuelvo a tu ejemplo que funciona estupendamente, pero tiene un peque帽o problema.

Si el usuario se decide cerrar la ventana pulsando la (x) del dialogo, la ventana se cierra, pero el proceso no termina. Es decir, "la calculadora" sigue abierta.

Como en mi aplicaci贸n es una llamada a una aplicaci贸n oculta en Java, la cosa se complica, porque no ve ninguna pantalla de la aplicaci贸n interna y es necesario llamar al Administrador de Tareas, para cerrar la aplicaci贸n y eso para los usuarios, es mucha tela.

He probado poner el arranque de la aplicaci贸n en el ON INIT, y de esa manera no logra iniciar la aplicaci贸n.

驴Se te ocurre alguna soluci贸n?

Un saludo



Manuel
Posts: 44162
Joined: Thu Oct 06, 2005 05:47 PM
Re: Waitrun y Timer
Posted: Sat Feb 20, 2010 04:20 PM
Manuel,

Si quieres impedir que cierren la ventana que lanza el proceso, puedes a帽adirle una cla煤sula VALID:
Code (fw): Select all Collapse
   ACTIVATE DIALOG oDlg CENTER ;
      ON INIT ( oProg:SetRange( 1,995 ), oTmr := Timer( oDlg, oProg, nInterval, @lExit ) ) ;
      VALID lExit

Hasta que lExit no cambie de .F. a .T. no se podr谩 cerrar la ventana.

En el caso de que quieras permitir que se cierre la ventana, pero que entonces se termine el proceso, deberias usar CreateProcess() para ejecutar el proceso y guardar el handle de este y TerminateProcess() para terminarlo al cerrarse la ventana.

Hace un par de dias, 贸 asi, hemos revisado aqui en el foro un ejemplo con CreateProcess() y TerminateProcess()
regards, saludos

Antonio Linares
www.fivetechsoft.com
Posts: 44162
Joined: Thu Oct 06, 2005 05:47 PM
Re: Waitrun y Timer
Posted: Sat Feb 20, 2010 04:23 PM

Aqui est谩 el enlace al ejemplo:

viewtopic.php?p=94861#p94861

regards, saludos

Antonio Linares
www.fivetechsoft.com
Posts: 711
Joined: Thu Oct 06, 2005 09:57 PM
Re: Waitrun y Timer
Posted: Sun Feb 21, 2010 05:14 PM

Antonio muchas gracias.

Desgraciadamente necesito seguir utilizando el WAITRUN, porque estoy llamando a un COMANDO de una aplicaci贸n hecha en Java. Por tanto, si no utilizo WAITRUN ( xxxx, 0) me muestra la pantalla negra del DOS, y eso resulta muy feo.

He estado probando con TASKKILL /IM xxxx, pero no es capaz de cerrar java.exe del Administrador de Tareas de Windows.

He pedido ayuda al creador del programa en Java, por si tiene un comando interno que CIERRE su aplicaci贸n.

Muchas gracias.

Un saludo



Manuel
Posts: 711
Joined: Thu Oct 06, 2005 09:57 PM
Re: Waitrun y Timer
Posted: Mon Feb 22, 2010 11:31 AM

Al final, he preparado una funcion con WMI y funciona bien. Por si alguien necesitara, en alguna ocasi贸n, matar un proceso desde una aplicaci贸n FWH, le dejo el c贸digo:

Include "WinApi.ch"

FUNCTION KillProceso ( cProceso )
Local oWMIob, oWMIserver, aProcess, objProcess

try
oWMIob := CreateObject( "wbemScripting.SwbemLocator" )
catch
RETURN nil
END

oWMIserver := oWMIob:ConnectServer()
aProcess :=oWMIserver:ExecQuery( "Select * from Win32_Process" )
For Each objProcess in aProcess
IF UPPER(objProcess:Name) = UPPER(cProceso)
objProcess:Terminate()
ENDIF
next

RETURN nil

Un saludo



Manuel
Posts: 44162
Joined: Thu Oct 06, 2005 05:47 PM
Re: Waitrun y Timer
Posted: Mon Feb 22, 2010 11:42 AM

Manuel,

gracias! :-)

regards, saludos

Antonio Linares
www.fivetechsoft.com
Posts: 1710
Joined: Tue Oct 28, 2008 06:26 PM
Re: Waitrun y Timer
Posted: Mon Feb 22, 2010 01:26 PM

Gracias Manuel

El killProceso funciona perfecto e una m谩quina local, c贸mo ser铆a para matar un proceso en red.

Algo asi como hace el programa WHOHAS

Saludos

Adhemar

Saludos,



Adhemar C.
Posts: 711
Joined: Thu Oct 06, 2005 09:57 PM
Re: Waitrun y Timer
Posted: Mon Feb 22, 2010 06:52 PM
acuellar wrote:El killProceso funciona perfecto e una m谩quina local, c贸mo ser铆a para matar un proceso en red.
Adhemar


Adhemar, no tengo ni idea. La funci贸n la he creado para solucionar un problema que tengo en local, cuando un usuario lanza una aplicaci贸n en Java (modo comandos) y decide cancelar el proceso durante la ejecuci贸n. Me he tirado el fin de semana buscando una soluci贸n y al final la he encontrado. Desconozco si se podr铆a modificar para utilizar en red.
Un saludo



Manuel
Posts: 1710
Joined: Tue Oct 28, 2008 06:26 PM
Re: Waitrun y Timer
Posted: Mon Feb 22, 2010 07:43 PM

Gracias Manuel

Esperare, quizas alguien tenga algo.

Saludos

Adhemar

Saludos,



Adhemar C.

Continue the discussion