Utenti collegati al programma

Salve a tutti,

ho creato un gestionale dove si collegano vari utenti, il db MySql vorrei trovare un metodo per capire chi collegato e chi no.
Per ora registro sulla tabella utente il log di accesso, e se l’utente “bravo” ed esce con il tasto uscita registo il log di uscita, ma se chiude la finestra con la “X” non so come fare, c’ un modo per controllare la “X” di chiusura’
So che il metodo che utilizzo non per nulla efficace ed elegante…

grazie sempre a tutti
Enrico

semplicemente usa l’evento close della window e richiama il metodo per aggiornare l’acceso dell’utente.

Non sar un metodo elegante Enrico, ma tutto quello che possiamo al momento utilizzare…
Comunque, io avevo utilizzato questo sistema.

Ho una tabella che chiamo utenti, una permessi e una loginuser
sulla prima ci sono tutti gli utenti e le loro password
sulla seconda i vari permessi per accedere alle varie funzioni, nel mio caso ogni finestra una funzione
e sulla terza registro gli accessi al login, appunto come ti ha indicato Luciano alla chiusura di MAIN elimino quel dato utente

Ora il tutto st nel prendersi un po’ di tempo e cercare una soluzione per tutte quelle volte che il sistema va in crash, e quindi l’utente rimane collegato.
L’unica a lato server creare un sistema di Polling ( quindi al login registra anche l’indirizzo ip della macchina dalla quale esegui il login ) e che di tanto in tanto pinga le macchine degli utenti connessi

In alternativa dovresti creare un user su mysql uno per ogni utente e interrogare appunto mysql con una query per vedere chi connesso.
Questo metodo, lo trovo un p pi solido.
In alternativa devi cominciare a pensare ad un app CLIENT/SERVER utlizzando una porta TCP per dialogare appunto tra client e server … un metodo un p difficile da utilizzare quanto efficace.

Grazie per le risposte,
Per quanto riguarda l’oggetto close ho dimenticato di dire che la mia una web app e non ho trovato il metodo close della windows, posso gestire il close nell’event handlers ma non lo stesso.
Stavo costruendo proprio un sistema di Polling, volevo essere certo di non avere gi a disposizione qualche cosa del genere.
Per quanto riguarda creare un user su mysql per ogni utente non l’ho presa in considerazione in quanto gli utenti sarebbero troppi.
Anche un app CLIENT/SERVER utlizzando una porta TCP non una brutta idea.

Grazie sempre
Enrico

Ciao Enrico,
in una web app ogni utente ha una propria session creata quando l’utente si collega e terminata quando l’utente si scollega.
A questo punto sapere chi e’ collegato e’ semplice: basta tenere traccia delle sessions.

Ciao, si l’idea mi piace c’ un esempio da poter seguire?

grazie
Enrico

// close all webpages
for i as integer = Session.PageCount-1 downto 0
Session.PageAtIndex(i).Close
next

Ciao Enrico,

non credo che sia necessario un esempio specifico.
Una session genera un evento di Open quando un nuovo utente si collega e un evento di Close generato quando la sessione termina.
Nota che una sessione termina sia che l’utente esca, usando laa tua espression, in modo “pulito” o chiudendo il browser o con qualunque altra operazione che sconnette l’utente dall’applicazione web.

Ogni sessione vive all’interno della App quindi la app contenere un elemento che tenga traccia in modo “globale” degli utenti collegati.

Fammi sapere cosa di piu’ specifico puo’ servire per chiarire eventuali dubbi.

Saluti.

Ciao Enrico,
un modo molto semplice questo:

ogni sessione ha una propriet che si chiama Title

quando l’utente fa la login tu setti questa propriet con le info che servono a te
es: Session.Title = “Mario”

poi da qualsiasi sessione per sapere chi connesso basta un semplice ciclo come questo:

for i as integer = 0 to app.SessionCount-1
MsgBox app.SessionAtIndex(i).Title
next

Spero che ti sia utile
Enzo

Ciao a tutti,

allora ho creato l’evento close sulla session nell’event handlers, all’interno metto il codice per l’aggiornamento del record per memorizzare il logout dell’utente.
Es:
//DB MYSQL

db.sqLexecute(“update Utenti set Data_Log_out = '” +Frm_LogUte.Date_Time + “’ where Codice = '” +str( vcodice) + “’”)

Ma se termino chiudendo il browser non passa dal quel punto…
Forse mi sono perso qualche cosa, ho guardato un po l’esempio del timedout sugli esempi di xojo ma anche li se chiudo con l “X” il browser ovviamente non passa dal codice.

Grazie
Enrico

La chiusura della sessione avviene se c’ inattivit per un certo tempo e quindi anche se chiudi il browser

Quando apri una session devi anche impostare il timeout,

le sessioni si attivano sempre con Timeout = 0 che significa nessun timeout.

Se usi la proprit Session.Title non hai bisogno di una tabella d’appoggio per sapere chi si loggato

Ciao Enrico,

la chiusura della session non e’ istantanea e dipende dalla proprieta’ WebApplication.SessionTimeout .
Quando scade questo tempo la sessione si chiude generando l’evento Close.

La proprieta’ WebSession.TimeOut imposta solo un tempo di monitoraggio di inattivita’ dell’utente dopo il quale viene generato l’evento WebSession.TimedOut .
Questo tempo e relativo evento generato, e’ piu’ simile al ritardo prima di attivare uno screen saver: l’utente non sta facendo nulla quindi…

Dal momento che se l’applicazione non e’ in esecuzione nessun utente e’ collegato puoi tranquillamente utilizzare qualsiasi dato interno all’applicazione stessa senza utilizzare il database per tenere traccia degli utenti connessi.
Un esempio potrebbe essere un dictionary dove utilizzare come key la Session Identifier e come value il nome o altro dell’utente.
A questo punto dictionary.count ritorna il numero di utenti, dictionary.keys e’ l’array degli identificatori di sessione e i values sono gli utenti stessi.

In session.open aggiungi al dictionary i dati della sessione/utente e in session.close rimuovi questi dati dal dictionary.

Saluti.

Buongiorno a tutti,

volevo ringraziare tutti per i vari consigli, in effetti affrontavo il problema (problema si fa per dire…) dal punto di vista sbagliato e passatemi la terminologia più da desktop che da web app.
Seguendo i vostri consigli ho creato una listbox, visibile solo dall’ admin del gestionale, che mi elenca le web-session attive, ora impostando il timeout sulla session riesco ad avere un monitor dei collegamenti attivi.

Grazie sempre del Vostro prezioso aiuto!