Visualizzazione dei risultati da 1 a 8 su 8
  1. #1
    Utente di HTML.it L'avatar di VaLvOnAuTa
    Registrato dal
    Jun 2002
    Messaggi
    2,003

    [Delphi] Gestire chiusura processo.

    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?

  2. #2
    Moderatore di Programmazione L'avatar di alka
    Registrato dal
    Oct 2001
    residenza
    Reggio Emilia
    Messaggi
    24,310
    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!
    MARCO BREVEGLIERI
    Software and Web Developer, Teacher and Consultant

    Home | Blog | Delphi Podcast | Twitch | Altro...

  3. #3
    Utente di HTML.it L'avatar di VaLvOnAuTa
    Registrato dal
    Jun 2002
    Messaggi
    2,003
    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

  4. #4
    Utente di HTML.it L'avatar di VaLvOnAuTa
    Registrato dal
    Jun 2002
    Messaggi
    2,003
    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).
    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?

  5. #5
    Moderatore di Programmazione L'avatar di alka
    Registrato dal
    Oct 2001
    residenza
    Reggio Emilia
    Messaggi
    24,310
    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:
    codice:
    procedure WMQueryEndSession(var Msg: TWMQueryEndSession); message WM_QUERYENDSESSION;
    Nell'implementazione, qualcosa di simile a:
    codice:
    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!

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

    Ciao!
    MARCO BREVEGLIERI
    Software and Web Developer, Teacher and Consultant

    Home | Blog | Delphi Podcast | Twitch | Altro...

  6. #6
    Utente di HTML.it L'avatar di VaLvOnAuTa
    Registrato dal
    Jun 2002
    Messaggi
    2,003
    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

  7. #7
    Utente di HTML.it L'avatar di VaLvOnAuTa
    Registrato dal
    Jun 2002
    Messaggi
    2,003
    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.

  8. #8
    Moderatore di Programmazione L'avatar di alka
    Registrato dal
    Oct 2001
    residenza
    Reggio Emilia
    Messaggi
    24,310
    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!
    MARCO BREVEGLIERI
    Software and Web Developer, Teacher and Consultant

    Home | Blog | Delphi Podcast | Twitch | Altro...

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2024 vBulletin Solutions, Inc. All rights reserved.