Page 1 of 1

Parar un programa en red.

PostPosted: Sun May 22, 2011 7:15 am
by Andrés González
Hola compañeros del foro, estoy desarrollando un programa que me controla los accesos de todos los programas por los usuarios, con lo cual sé cuando un programa está abierto. Muchas veces los usuarios lo dejan funcionando durante el fin de semana y como mi programación se basa en ficheros externos, cuando algunas veces intento modificar alguno de estos ficheros externos están cogidos por el programa principal y no me deja modificarlos hasta que el usuario deje de utilizar dicho programa. Me preguntaba si existe alguna manera de parar la execución del programa desde la red. Estoy pensando en poner algun timer que me mire un fichero externo y dependiendo de los que contenga ese fichero lo pare, evite que la gente se conecte o que controle la inactividad del programa.

Sabéis si existe alguna otra manera de parar el programa en red? Necesito solo parar ese programa no el resto de aplicaciones, con lo que no me valen cosas como el VNC el TeamViewer o similares. Tampoco matar los procesos desde el servidor, necesito que el programa se cierre correctamente y no me deje colgado ningún proceso. Alguna idea de como hacerlo, alguien ha hecho algo similar?

Un saludo.

Re: Parar un programa en red.

PostPosted: Sun May 22, 2011 1:57 pm
by cuatecatl82
Saludos y buen Domingo:

A mi me pasaba lo mismo, necesitaba indexar tablas en mi sistema cada que necesitaba hacer un proceso de envio de archivos para otras tiendas, lo unico que pude hacer de forma rapida y funcional era intalar VNC Viewer en la Pc donde yo estaba y VNC server en todas las maquinas terminales que son gratuitos, cuando alguien se quedaba colgado sin hacer nada yo entraba y mediante su numero IP o nombre de terminal de red entraba y cerraba su sesión, era un poco engorroso y hasta en cierto punto les molestaba que hiciera eso, pero no me quedaba de otra.

La opcion de usar el timer es buena, pero tendrias que controlar cuando tu Programa esta en espera sin hacer nada o "IDLE" con SetIdleAction(), a mi no me funciono o no supe implementarlo, por eso uso lo que te comente.

Si alguien más pudiera asesorarte y que funcione seria estupendo...

Re: Parar un programa en red.

PostPosted: Sun May 22, 2011 2:37 pm
by WilliamAdami
Hola , Yo utilizo lo codigo seguinte para LOGOFF del sistema quando lo MOUSE o lo KEYBOARD estiverem inactivos por un tiempo ( nTempo_Espera ) . Talvez possa ajuda-lo.

Saludos

William Adami (Brasil)


* exemplo do uso da classe Tinativo
* Apos um tempo de inatividade do mouse
* e do teclado chama uma funcao qualquer.

#include "fivewin.ch"

static oWnd

*************
function main
*************

nTempo_espera:=10 //Tempo a ser esperado ate chamar a funcao

cNome_funcao:="LOGOFF()" //nome da funcao a ser chamada quando
//chegar no tempo de espera

lTimercontinua:=.f. //se apos executar a funcao , continua monitorando
//a inatividade do mouse e teclado.

define window oWnd title "Teste de teclado e mouse"

activate window oWnd on init tinativo():new(nTempo_espera,cNome_funcao, lTimerContinua)

return NIL


function logoff

msgalert("AQUI SU FUNCTION DE LOGOFF !","AVISO")

return nil


*****TINATIVO.PRG
*****************************************
* CLASSE PARA DETECTAR SE O SISTEMA ESTA
* INATIVO POR (N) SEGUNDOS, E SE ESTIVER,
* CHAMA UMA FUNCAO (PODE SER UMA FUNCAO
* DE LOGOFF , DESCANSO DE TELA , ETC..)
*****************************************
* AUTOR DA FUNۂO ORIGINAL :
* POMPEO (GUARATINGUETA)
* MIGRAۂO DA FUNۂO PARA CLASSE:
* WILLIAM DE BRITO ADAMI
*****************************************
#include "fivewin.ch"

CLASS TINATIVO

DATA nTimeInpAntes
DATA nTimeInpDepois
DATA cTimeAtu
DATA nTempo
DATA oTimerTime
DATA cFunc
DATA lContinuar

METHOD NEW( nTime, cFuncao, lContinua ) CONSTRUCTOR

METHOD ver_tempo()

ENDCLASS


**********************
METHOD new(ntime,cFuncao,lContinua) CLASS TINATIVO
**********************
::cfunc:=cfuncao
::ntempo:=ntime
::lContinuar:=lContinua
::oTimerTime := TTimer():New( 1000, { || ::VER_TEMPO() } )
::oTimerTime:Activate()
::cTimeAtu := time()
::nTimeInpAntes := getInputState() // 0 = erro

return self


*************************
METHOD VER_TEMPO CLASS TINATIVO
*************************
::nTimeInpDepois := getInputState()
if ( ::nTimeInpDepois - ::nTimeInpAntes ) > 0
::nTimeInpAntes := getInputState()
::cTimeAtu := time()
endif


if ( CONVTIME(time()) - CONVTIME(::cTimeAtu) ) > ::ntempo
::oTimerTime:DeActivate()

aux:=::cfunc

* aqui executa a funcao

&aux

if ::lContinuar

::oTimerTime:Activate()
::cTimeAtu := time()

endif


endif

return NIL


FUNCTION CONVTIME(ZZ)
Z:=(VAL(LEFT(ZZ,2))*360)+(VAL(SUBSTR(ZZ,4,2))*60)+VAL(RIGHT(ZZ,2))
RETURN Z


**----------------------------------------------------------------------
#pragma BEGINDUMP
#define _WIN32_WINNT 0x0500
#define WINVER 0x0500
#include "windows.h"
#include "hbapi.h"
HB_FUNC( GETINPUTSTATE )
{
LASTINPUTINFO lpi;
lpi.cbSize = sizeof(LASTINPUTINFO);
if (!GetLastInputInfo(&lpi))
{
hb_retni(0);
}
hb_retni(lpi.dwTime);
}
#pragma ENDDUMP

Re: Parar un programa en red.

PostPosted: Sun May 22, 2011 6:59 pm
by FiveWiDi
Andrés González wrote:Hola compañeros del foro, estoy desarrollando un programa que me controla los accesos de todos los programas por los usuarios, con lo cual sé cuando un programa está abierto. Muchas veces los usuarios lo dejan funcionando durante el fin de semana y como mi programación se basa en ficheros externos, cuando algunas veces intento modificar alguno de estos ficheros externos están cogidos por el programa principal y no me deja modificarlos hasta que el usuario deje de utilizar dicho programa. Me preguntaba si existe alguna manera de parar la execución del programa desde la red. Estoy pensando en poner algun timer que me mire un fichero externo y dependiendo de los que contenga ese fichero lo pare, evite que la gente se conecte o que controle la inactividad del programa.

Sabéis si existe alguna otra manera de parar el programa en red? Necesito solo parar ese programa no el resto de aplicaciones, con lo que no me valen cosas como el VNC el TeamViewer o similares. Tampoco matar los procesos desde el servidor, necesito que el programa se cierre correctamente y no me deje colgado ningún proceso. Alguna idea de como hacerlo, alguien ha hecho algo similar?

Un saludo.

Hola,

Yo lo haría con un TIMER.

Cada 60 minutos abro una tabla miro el valor de un campo (por ejemplo ALACALLE), si su valor es .T. salgo del sistema.

En el momento de entrar en el sistema hago lo mismo, y si su valor sigue siendo .T. pues salgo antes de hacer nada más.

Así sabes que si tu das valor .T. a ese campo, como mucho al cabo de una hora estan todos fuera, haces lo que quieras y das valor .F. al campo.

Re: Parar un programa en red.

PostPosted: Mon May 23, 2011 5:32 am
by Andrés González
Gracias a todos por vuestras respuestas, especialmente a williamadami. Pruebo lo que tu has puesto y luego comento.

Re: Parar un programa en red.

PostPosted: Mon May 23, 2011 3:21 pm
by JmGarcia
Y algo tan sencillo como un TXT en el servidor que contenga "comandos inventados" por nosotros en el sentido de que si el fichero esta vacio no pasa nada.
Si vemos que el usuario "USER-1" lo queremos "matar" pues modificamos ese TXT poniendo una línea con el contenido "USER-1 LOGOFF".
En el programa del USER-1 un timer (no muy espaciado, cada 5 minutos por ejemplo) que leea ese fichero TXT y si "se da por aludido" en el contenido del mismo se "auto-mata" el programa.

¿ Me he explicado ? o me he muerto yo tambien jejejejajajaja :P