PDA

Visualizza la versione completa : [DELPHI] Intercettare la chiusura del processo


VaLvOnAuTa
29-11-2005, 10:50
Ho realizzato un software in delphi che all'avvio si connette ad un db mysql e setta un campo booleano a true. Questo serve per capire che il client è online. Ovviamente alla chiusura del client, si riaggiorna il campo del db che viene settato a false. Il problema sorge quando il processo del client viene chiuso brutalmente (magari spegnendo il computer senza chiudere prima l'applicazione). Il campo del database non viene aggiornato a false e quindi l'utente risulta sempre online.

C'è una qualche possibilità di gestire questo tipo d'evento?

alka
29-11-2005, 11:14
Diciamo che hai scelto lo strumento sbagliato per ottenere la funzionalità di cui hai bisogno.

Senza entrare nel merito, credo che in caso di crash del tuo programma, ammesso che sia possibile intercettarlo, tu non possa in realtà fare uso delle risorse dell'applicazione; inoltre, non puoi garantire che quel flag venga comunque resettato: se io stacco la spina del PC, voglio vedere cosa intercetti. :)

Il mio suggerimento è quello di usare un socket, magari sfruttando il protocollo UDP, per mandare segnalazioni ad un server che consenta di informare chi è online, invece di usare un database che, oltre a rallentare e a complicare le cose, è un metodo insicuro, poco portabile e in frangenti come quello che ti ho illustrato diventa inefficace.

Ciao! :ciauz:

VaLvOnAuTa
29-11-2005, 11:18
Sì infatti avevo pensato ad una soluzione di questo tipo:
un server che ogni tot manda dei keep alive e se non riceve risposta flagga come disconnesso il dato client.
L'utilizzo del database interviene per necessità intrinseche alla problematica per il quale il software è stato sviluppato (deve interagire con uno script php).
Però ora che ci penso, invece di utilizzare mysql potrei utilizzare xml..

Grazie per la dritta, come sempre gentilissimo :)

VaLvOnAuTa
30-11-2005, 18:47
Chiedo scusa se riprendo questa discussione, ma adesso ho un problema diametralmente opposto a quello proposto inizialmente:
ho sviluppato un'applicazione che impedisce al SO di spegnersi (e non era mia intenzione). :dhò:
Mi spiego: ho risolto il problema utilizzando il componente NMHTTP che, tramite un timer, ogni secondo invia un get ad uno script php che si occupa di mantenere il keep-alive dei vari software.
Ora però, se non si chiude il software non è praticamente possibile spegnere il computer.
Ho pensato inizialmente che fosse il timer. Ho provato ad eliminarlo ma il SO, con il software attivo, non si spegne ugualmente. Quindi, per esclusione, non può essere che il componente NMHTTP a creare il problema.
Qualcuno mi sa confermare e, eventualmente, darmi una soluzione pratica? :D

alka
30-11-2005, 19:28
Il problema è dovuto al fatto che il tuo programma deve rispondere correttamente alla richiesta fatta da Windows al momento della chiusura di quest'ultimo.

Ad esempio, puoi introdurre nel tuo form principale un metodo apposito per la gestione del messaggio; nella dichiarazione:


procedure WMQueryEndSession(var Msg: TWMQueryEndSession); message WM_QUERYENDSESSION;


Nell'implementazione, qualcosa di simile a:


procedure TMainForm.WMQueryEndSession(var Msg: TWMQueryEndSession);
begin
// Query Windows shutdown
try
try
// OPERAZIONI NECESSARIE ALLA CHIUSURA DEL PROGRAMMA
Self.Close;
except
// No action
end;
finally
Msg.Result := 1;
end;
end;


Ciao! :ciauz:

P.S.: per domande relative ad argomenti differenti, apri una discussione nuova.

Ciao! :ciauz:

VaLvOnAuTa
30-11-2005, 19:29
Ok ho risolto.
Evidentemente il componente NMHTTP crea dei problemi (non so quali).
Ho sostituito tale componente con il componente IdHTTP degli Indy ed il problema è stato risolto :)

VaLvOnAuTa
30-11-2005, 19:34
Grazie per la risposta alka.
Credo che mi tornerà moooolto utile per risolvere un altro problema :)

P.S. Scusa.. la prossima volta aprirò un altro thread.

alka
30-11-2005, 19:34
Originariamente inviato da VaLvOnAuTa
Evidentemente il componente NMHTTP crea dei problemi (non so quali).
Ho sostituito tale componente con il componente IdHTTP degli Indy ed il problema è stato risolto :)
Forse il componente manteneva attivo qualche thread che andava "distrutto" attraverso un apposito metodo. Non ricordo come funzionano quei componenti.

Ciao! :ciauz:

Loading