Visualizzazione dei risultati da 1 a 8 su 8
  1. #1
    Utente di HTML.it
    Registrato dal
    Mar 2004
    Messaggi
    204

    Controllare il lancio di un'applicazione

    Ciao, ho scoperto sta mattina che la commessa non molto esperta di un negozio lancia durante il lavoro per 10-15 volte l'applicazione che ho installato su quel pc senza accorgersi che è semplicemente ridotto ad icona creando non pochi problemi.

    Come posso controllare se il programma è già in esecuzione e quindi bloccare o far apparire il programma già lanciato?

    Grazie

  2. #2
    Moderatore di Programmazione L'avatar di alka
    Registrato dal
    Oct 2001
    residenza
    Reggio Emilia
    Messaggi
    24,466
    Leggi questo articolo (in lingua inglese).

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

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

  3. #3
    io procedo in questa maniera.
    Ogni volta che la applicazione viene lanciata controlla per prima cosa se esiste un certo file nascosto. Se questo non esiste lo crea e lancia l'applicazione, se invece esiste la applicazione non parte. Quando la applicazione viene chiusa il file nascosto viene cancellato.
    ciao
    sergio

  4. #4
    Moderatore di Programmazione L'avatar di alka
    Registrato dal
    Oct 2001
    residenza
    Reggio Emilia
    Messaggi
    24,466
    Originariamente inviato da mondobimbi
    Ogni volta che la applicazione viene lanciata controlla per prima cosa se esiste un certo file nascosto. Se questo non esiste lo crea e lancia l'applicazione, se invece esiste la applicazione non parte. Quando la applicazione viene chiusa il file nascosto viene cancellato.
    E' un metodo rischioso: se l'applicazione viene terminata in modo anomalo, è necessario rimuovere il file manualmente per farla ripartire.

    E' sufficiente usare un mutex attribuendogli un nome con la funzione API CreateMutex e verificarne la presenza in memoria quando si avvia l'applicazione; se non è possibile prendere il possesso del mutex, significa che l'applicazione è già attiva.

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

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

  5. #5
    Originariamente inviato da alka
    E' un metodo rischioso: se l'applicazione viene terminata in modo anomalo, è necessario rimuovere il file manualmente per farla ripartire.
    direi fastidioso se va in crash, tuttavia mozilla e firefox funzionano così.
    ciao

  6. #6
    Moderatore di Programmazione L'avatar di alka
    Registrato dal
    Oct 2001
    residenza
    Reggio Emilia
    Messaggi
    24,466
    Originariamente inviato da mondobimbi
    direi fastidioso se va in crash
    Più che fastidioso, alquanto problematico.

    Originariamente inviato da mondobimbi
    tuttavia mozilla e firefox funzionano così.
    Sono applicazioni progettate per altre piattaforme diverse da Windows, pertanto non possono fare affidamento sui mutex (in quanto non esistono o sono differenti in altre piattaforme diverse da Windows).

    Per un'applicazione Delphi, si tratta di un'inutile complicazione rispetto all'uso del mutex che, in certi casi, come nell'uso dell'installer Inno Setup, consente di verificare se un'applicazione è aperta.

    Si tratta in sostanza di una metodologia pratica standard e comunemente seguita, pertanto efficace e vivamente consigliata rispetto ad altre soluzioni, almeno in Windows (che è l'ambiente trattato da Delphi).

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

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

  7. #7
    Utente di HTML.it
    Registrato dal
    Jul 2006
    Messaggi
    1
    Io ho risolto lo stesso problema usando la FindWindow() inserendola nel sorgente principale.

    program .....
    uses ......


    const
    ProgName = 'Nome etichetta del form principale';
    ClassProg='Nome classe del form principale';
    var
    MyProg: THandle;

    Myprog := FindWindow(ClassProg, ProgName) ; //Cerca l'handle dell'applicazione
    If MyProg <> 0 Then //impedisce che l'applicazione venga avviata più volte
    begin
    Application.MessageBox('Applicazione già avviata.... ', ProgName, MB_OK + MB_ICONINFORMATION);
    Application.Terminate;
    end else begin
    //inserire qui il restante codice per l'inizializzazione dell'applicazione
    .....
    ....

  8. #8
    Moderatore di Programmazione L'avatar di alka
    Registrato dal
    Oct 2001
    residenza
    Reggio Emilia
    Messaggi
    24,466
    Originariamente inviato da antovar
    Io ho risolto lo stesso problema usando la FindWindow() inserendola nel sorgente principale.
    Sì, è un'altra delle alternative, anche se si corre maggiormente il rischio di incontrare un'altra applicazione dalle medesime caratteristiche. Pur essendo una soluzione viabile, il mutex risulta in generale quella più "sicura".

    P.S.: non chiamare il metodo Application.Terminate, non è necessario (peraltro, l'applicazione non è ancora stata avviata in quel punto, quindi non ottieni alcun effetto). In generale, affinché un'applicazione non entri in esecuzione, è sufficiente che il programma principale (la parte compresa tra begin...end nel file DPR) si concluda senza chiamare il metodo Application.Run. E' la forma corretta per eludere l'avvio dell'applicazione senza correre il rischio di generare errori che si adatta a tutti i casi in assoluto.

    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 © 2025 vBulletin Solutions, Inc. All rights reserved.