Page 1 of 1
Amount of users on network
Posted: Sun Oct 06, 2019 8:10 pm
by Marc Vanzegbroeck
Hi,
Is there a way to see how many users open a FWH program on a network.
I know I can make a counter in a database that increase everytime that program is executed, en decrease while exiting.
The problem there can be that when the program crash, or when the network-connection is broken, the counter is wrong.
Re: Amount of users on network
Posted: Wed Oct 09, 2019 3:30 pm
by FranciscoA
Hi, please try this:
The UserLogging function creates the txt file for user control when it enters the program and deletes it when it exits.
To view all connected users, you can use the ShowConectedUsers function.
( Idea tomada de un usuario aqui en el foro: hmpaquito)
http://fivetechsupport.com/forums/viewt ... 7bf#p82909
Code: Select all
//----------------------------------------------------------------
//USUARIOS CONECTADOS -- Francisco J. Alegria P. Sept/2010
//----------------------------------------------------------------
//---------------------------------------------------------------//Ctrl usuarios activos en este programa
Function UserLogging(lNew)
local cDirUserLog := cPathDef+"\USERSLOG"
local cUserLog
local cEquipo:=NetName(.f.)
local nHand, FO_SHARED := 64
If !lIsDir(cDirUserLog) //creamos el sub-dir
lMkDir(cDirUserLog)
Endif
//cNombUser es static, y se toma del fich de usuarios
cUserLog := cDirUserLog+"\"+Substr(cNombUser,1,12)+cEquipo+".log"
If lNew //Entrando
nHand := FCreate( cUserLog )
FWrite(nHand, cNombUser + CRLF+; //usuario del programa
cEquipo + CRLF+"") //nombre del equipo
FClose(nHand)
//Lo abrimos en modo shared. (nHandUserLog es static)
//Cuando se requiere ver los conectados al programa, se trata de abrir en exclusivo,
//y si no se puede, es que el usuario esta conectado al programa. (Ver ShowConnectedUsers())
nHandUserLog := FOpen( cUserLog, FO_SHARED ) // abrimos el fichero compartido
Else //Saliendo
FClose(nHandUserLog)
Ferase(cUserLog)
Endif
Return nil
/* --------------------------------------------------------------------
//Fileio.ch
OPEN MODES:
FO_READ 0 Open file for reading
FO_WRITE 1 Open file for writing
FO_READWRITE 2 Open file for reading and writing
SHARING MODES:
FO_COMPAT 0 Compatibility mode
FO_EXCLUSIVE 16 Exclusive use
FO_DENYWRITE 32 Prevent other applications from writing
FO_DENYREAD 48 Prevent other applications from reading
FO_DENYNONE 64 Allow others to read or write
FO_SHARED 64 Same as FO_DENYNONE
-------------------------------------------------------------------- */
//----------------------//Mostrar usuarios activos en este programa
Function ShowConnectedUsers()
local cDirUserLog := cPathDef+"\USERSLOG"
local aDir := DIRECTORY(cDirUserLog + "\*.*", )
local nHand, aActiveUsers:={}, cLogText, cFich
local cUserName,cComputName
local FO_EXCLUSIVE:=16
AEVAL( aDir, {|aFich| cFich:=cDirUserLog+"\"+aFich[F_NAME],;
if( nHand := FOpen( cFich, FO_EXCLUSIVE ) < 0,; //si no se abre exclusivo es que usuario esta conectado.
( cLogText := MemoRead(cFich),;
cUserName := Trim(MemoLine(cLogText, 254,1)),;
cComputName := Trim(MemoLine(cLogText, 254,2)),;
aadd( aActiveUsers, {cUserName,cComputName} ) ),;
FClose(nHand) ) } )
XBrowse(aActiveUsers,"Usuarios conectados a "+cExeName)
Return nil
Regards.
Re: Amount of users on network
Posted: Wed Oct 09, 2019 4:21 pm
by Marc Vanzegbroeck
Francisco,
Thank you for the reply.
Now I have already something like that, but instead of saving it to a file, I save it in the database.
The problem is that when the program is started, it save it to the database, but when the connecting is lost, without exiting the program first, or if the program crashed, the data is still in the database.
So, the other users think that the user is still in the program.
The only way that I can remove it by starting the program again from the same PC/USER.
Re: Amount of users on network
Posted: Wed Oct 09, 2019 8:08 pm
by Marcelo Via Giglio
Hello Marc,
I don't sure, but I think one way can be to lock a record in a table (dbf) users while the user is logged, when the user logout, unlock the record, I think (no sure) when client lost the conection, the record is unlocked automatlicaly, you can test
saludos
Marcelo