[Risolto] Intercettare istanza del programma già in esecuzione

di il
24 risposte

[Risolto] Intercettare istanza del programma già in esecuzione

Ciao a tutti,
non so se il titolo rende l'idea ma vorrei poter eseguire un programma che prima di visualizzare l'interfaccia grafica, verifichi se esiste già un'istanza dello stesso programma in esecuzione e se esiste passi il fuoco a quell'istanza (in pratica la porti in primo piano rispetto alle altre applicazioni) e termini la sua esecuzione (quella della seconda istanza).

Possibilmente quando l'istanza in esecuzione esegue una certa operazione richiesta dall'utente, dovrebbe rendersi invisibile pur rimanendo in esecuzione, in modo che ad un seccessivo run della stessa applicazione venga semplicemente attivata l'istanza invisibile.

Non so se mi sono spiegato.
Lo scopo è di velocizzare la comparsa del programma ogni volta che ne ho bisogno, perchè la prima attivazione è troppo lenta.

Qualcuno sa darmi indicazioni su come realizzare una cosa del genere?

24 Risposte

  • Re: [Risolto] Intercettare istanza del programma già in esecuzione

    Ciao, stai usando una tecnologia in particolare? (librerie/framework...) hai vincoli sul sistema operativo utilizzato?
  • Re: [Risolto] Intercettare istanza del programma già in esecuzione

    Hai ragione, non ho fornito dettagli.

    Tieni conto che su java sono totalmente neofita.
    Quello che ho descritto l'avevo realizzato quando sviluppavo in VB6 ovviamente solo su Windows fino a XP.

    L'applicazione dovrebbe essere totalmente multipiattaforma, perché ho WinXP, Win7, Win8.1, Kubuntu 14.04, Kubuntu 18.04.
    E poi vorrei che la potesse usare anche un mio amico che invece "purtroppo" usa un mac.

    Ora sto usando Netbeans (sia su Windows che su Kubuntu) come strumento di sviluppo, ma nessuna libreria particolare e i framework non ho ancora ben chiaro cosa siano.

    Grazie per l'interessamento, ed eventuali dritte.
  • Re: [Risolto] Intercettare istanza del programma già in esecuzione

    Proprio nessuno riesce a darmi una dritta?
    Io cercando sul web trovo tante info sulla gestione dei thread ... ma non mi sembra che servano nel mio caso ...
  • Re: [Risolto] Intercettare istanza del programma già in esecuzione

    Se l'interfaccia grafica di cui tu parli e' composta da JFrame allora si potresti hide/show
  • Re: [Risolto] Intercettare istanza del programma già in esecuzione

    Ok, hide/show va bene per nascondere la form,
    ma il mio problema più grosso è:
    come intercettare un'istanza già attiva dello stesso programma?
  • Re: [Risolto] Intercettare istanza del programma già in esecuzione

    ZioCrick ha scritto:


    come intercettare un'istanza già attiva dello stesso programma?
    La questione quindi è, detto diversamente: come far comunicare due istanze della stessa applicazione? Con qualunque meccanismo di IPC (inter-process communication), anche banalmente dei "socket". O in alternativa con un file "comune" su cui passare/scambiare dati (ma è più difficile per questioni di sincronizzazione ecc...).
    E c'è un'altra questione: da una applicazione Java non puoi "trovare" un'altra finestra di un'altra applicazione (Java o nativa), perlomeno non con il framework standard. Posso verificare ma ... non mi pare sia possibile. Quindi bisognerebbe comunicare alla applicazione già in esecuzione da prima: "tirati sù in primo piano" (che io poi termino).
  • Re: [Risolto] Intercettare istanza del programma già in esecuzione

    In c# potresti ciclare sulla lista dei processi in esecuzione e controllare se ce ne è uno con lo stesso nome già in esecuzione :qualcosa di simile
    Process[] processlist = Process.GetProcesses();

    foreach(Process theprocess in processlist){
    Console.WriteLine(“Process: {0} ID: {1}”, theprocess.ProcessName, theprocess.Id);
    }

    in JAVA ho visto quest'esempio https://www.rgagnon.com/javadetails/java-0593.htm ,ce ne saranno altri , ciao
  • Re: [Risolto] Intercettare istanza del programma già in esecuzione

    andbin ha scritto:


    La questione quindi è, detto diversamente: come far comunicare due istanze della stessa applicazione?
    Allora, sicuramente questa è una cosa che non so fare, perchè non so nulla di IPC e socket ...
    ma prima ancora devo scoprire se l'applicazione è già in esecuzione, per poi mandarle un messaggio di rendersi visibile e portarsi in primo piano, per poi terminare la seconda istanza.

    Quindi bisognerebbe comunicare alla applicazione già in esecuzione da prima: "tirati sù in primo piano" (che io poi termino).
    E' esattamente quello che vorrei fare, ma prima devo scoprire che esiste già un'istanza in esecuzione.

    gian82 ha scritto:


    in JAVA ho visto quest'esempio https://www.rgagnon.com/javadetails/java-0593.htm ,ce ne saranno altri , ciao
    Si io sto cercando di imparare Java.
    Beh, complimenti per aver trovato l'esempio. Io da tempo ne cercavo ma ... nisba ...
    ad ogni modo quell'esempio utilizza un programma specifico di Windows (Tasklist.exe).
    Io invece vorrei usare (se esiste) un metodo multipiattaforma.
  • Re: [Risolto] Intercettare istanza del programma già in esecuzione

    Aggiornamento:
    Finalmente sto iniziando a studiare qualcosa sui socket, ma da quel che ho letto fino ad ora si parla di una comunicazione tra un server e un client.
    E' vero che possono essere sullo stesso computer, ma si tratta pur sempre di due programmi diversi, mentre io ho l'esigenza di comunicare tra due istanze dello stesso programma.
    Inoltre mi sembra di capire che il programma che fa da server si ferma in uno stato di ascolto di eventuali richieste dal client, quindi non può fare altro che attendere, mentre io ho bisogno che faccia altro, interagendo con l'utente, e che eventualmente, in modo asincrono, riceva un messaggio che gli dica di portarsi in primo piano.
    Sto capendo bene, o c'è qualcosa che non ho ancora studiato, e che potrebbe adattarsi alla mia necessità?
  • Re: [Risolto] Intercettare istanza del programma già in esecuzione

    ZioCrick ha scritto:


    Finalmente sto iniziando a studiare qualcosa sui socket, ma da quel che ho letto fino ad ora si parla di una comunicazione tra un server e un client.
    Sì, con i socket (sia su UDP cioè i "datagram" che su TCP) c'è sempre un "client" e un "server". Ma vuol solo dire che qualcuno (il server) è già in attesa di qualcosa e l'altro (il client) invece arriva dopo per inviargli qualcosa. Tutto lì.

    ZioCrick ha scritto:


    io ho l'esigenza di comunicare tra due istanze dello stesso programma.
    Sono comunque processi diversi. Con i socket, vorrebbe solo dire che la prima istanza resta in ascolto su una porta X e qualunque altra istanza avviata dopo cerca di connettersi a quella porta X.

    EDIT: anzi, è più giusto dire che la seconda istanza cerca di "ascoltare" su quella stessa porta e ovviamente è già in uso, quindi il bind fallisce. Allora può poi connettersi a quella porta per notificare la prima istanza, ad esempio per dirgli di mettersi in primo piano (tanto per dire uno scenario sensato).

    ZioCrick ha scritto:


    Inoltre mi sembra di capire che il programma che fa da server si ferma in uno stato di ascolto di eventuali richieste dal client, quindi non può fare altro che attendere
    Certo che può fare "altro". L'ascolto su una certa porta lo si fa su un thread separato. Devi approfondire il multi-threading ..

    ZioCrick ha scritto:


    c'è qualcosa che non ho ancora studiato, e che potrebbe adattarsi alla mia necessità?
    Sì ... ne hai da studiare ..
  • Re: [Risolto] Intercettare istanza del programma già in esecuzione

    Grazie per i chiarimenti:

    andbin ha scritto:


    Con i socket, vorrebbe solo dire che la prima istanza resta in ascolto su una porta X e qualunque altra istanza avviata dopo cerca di connettersi a quella porta X.
    Ok, ma siccome dall'interno del programma non so se sono la prima istanza o una successiva, dovrei comunque per prima cosa aprire una "sessione" (non so se si dice così) come client e se nessuno mi risponde, significa che sono la prima istanza, quindi chiudo il client e mi predispongo come server?
    Se fosse così, però non posso aspettare qualche tipo di timeout, ma avrei bisogno di una risposta istantanea perché il programma, immediatamente dopo deve rispondere alla richiesta dell'utente che ha pigiato l'opportuna combinazione di tasti di scelta rapida.

    andbin ha scritto:


    Certo che può fare "altro". L'ascolto su una certa porta lo si fa su un thread separato. Devi approfondire il multi-threading ..
    Lo supponevo ... ma speravo di non dover affrontare anche questa cosa ...

    andbin ha scritto:


    Sì ... ne hai da studiare ..
    Purtroppo si ...
  • Re: [Risolto] Intercettare istanza del programma già in esecuzione

    ZioCrick ha scritto:


    Ok, ma siccome dall'interno del programma non so se sono la prima istanza o una successiva, dovrei comunque per prima cosa aprire una "sessione" (non so se si dice così) come client e se nessuno mi risponde, significa che sono la prima istanza, quindi chiudo il client e mi predispongo come server?
    Se fosse così, però non posso aspettare qualche tipo di timeout, ma avrei bisogno di una risposta istantanea perché il programma, immediatamente dopo deve rispondere alla richiesta dell'utente che ha pigiato l'opportuna combinazione di tasti di scelta rapida.
    L'ho precisato poco fa perché prima avevo scritto di fretta:

    andbin ha scritto:


    EDIT: anzi, è più giusto dire che la seconda istanza cerca di "ascoltare" su quella stessa porta e ovviamente è già in uso, quindi il bind fallisce. Allora può poi connettersi a quella porta per notificare la prima istanza, ad esempio per dirgli di mettersi in primo piano (tanto per dire uno scenario sensato).

    ZioCrick ha scritto:


    Lo supponevo ... ma speravo di non dover affrontare anche questa cosa ...
    A meno di fare una applicazione super-semplice e senza GUI grafica .... il multi-threading è indispensabile.
  • Re: [Risolto] Intercettare istanza del programma già in esecuzione

    andbin ha scritto:


    L'ho precisato poco fa perché prima avevo scritto di fretta:
    Ah ok, cercherò di realizzare la struttura che mi hai descritto.

    andbin ha scritto:


    A meno di fare una applicazione super-semplice e senza GUI grafica .... il multi-threading è indispensabile.
    Questo invece mi sconcerta. Perché da quando ho iniziato a studiare Java ho realizzato una piccola applicazione, con interfaccia grafica, per la gestione del mio archivio di film, con varie finestre, interazione con un db e attivazione di altre applicazioni per ricerche sul web o per mostrare foto e immagini, ma non ho mica implementato una struttura di multi-threading ...
    Mi chiedo allora ... che cosa ho combinato?
  • Re: [Risolto] Intercettare istanza del programma già in esecuzione

    ZioCrick ha scritto:


    Questo invece mi sconcerta. Perché da quando ho iniziato a studiare Java ho realizzato una piccola applicazione, con interfaccia grafica, per la gestione del mio archivio di film, con varie finestre, interazione con un db e attivazione di altre applicazioni per ricerche sul web o per mostrare foto e immagini, ma non ho mica implementato una struttura di multi-threading ...
    Mi chiedo allora ... che cosa ho combinato?
    Nelle applicazioni Swing tutta la gestione degli eventi e il disegno della interfaccia grafica vengono fatti nel contesto di un unico thread che è convenzionalmente chiamato il Event Dispatch Thread (EDT).
    C'è un loop nel framework che "scoda" continuamente dei messaggi di evento e per ciascuno esegue quello che è necessario. Essendo un unico thread, fa solo una cosa per volta: o sta disegnando un componente X o un componente Y o sta invocando un ActionListener o ecc...

    Se non hai considerato il multi-threading è sicuramente perché hai fatto query su db e quant'altro nel contesto del EDT.
    Nulla di grave in senso assoluto. Ma se alla invocazione di es. un actionPerformed fai una query che impiega 10 secondi, stai tenendo tu "impegnato" il EDT. E quindi il controllo non può tornare subito al framework, che quindi non può fare, disegnare, notificare altro.

    Il risultato è che in quel frangente di tempo la tua interfaccia grafica è completamente "congelata", non responsiva. E questo generalmente è un limite abbastanza importante e noioso. E lo si risolve appunto con il multi-threading.
Devi accedere o registrarti per scrivere nel forum
24 risposte