View Full Version : Programma con un'unica istanza
tomminno
27-06-2007, 14:33
Cosa bisogna fare per creare un programma "singleton"?
Magari il modo per farlo sia su Windows che su Linux.
ilsensine
27-06-2007, 14:36
Su linux, il modo pulito (che usano quasi tutti) è utilizzare un pid file (v. /var/run)
La cosa che si usava di più prima che venisse fuori Windows XP era l'utilizzo delle funzioni FindWindow()/FindWindowEx() per cercare una finestra con una certa classe e/o titolo (ammesso che l'applicazione faccia uso di finestre, chiaramente).
Windows XP ha introdotto la funzionalità di fast user switching e FindWindow non va più bene. Infatti FindWindow cerca la finestra solo nel desktop corrente e non nei desktop creati in altre sessioni utente.
La cosa migliore è usare un kernel object globale, un evento o un mutex che abbia un nome specifico.
Su Windows dovrebbe bastare una named mutex creata con CreateMutex...
morskott
28-06-2007, 00:40
Cosa bisogna fare per creare un programma "singleton"?
Magari il modo per farlo sia su Windows che su Linux.
Bhe, usando java basterebbe una classepublic class MySingleton{
private static MySingleton istance; //variabile statica contenente l'unica istanza della classe nel sistema
//altre variabili di istanza
private MySingleton(){} //costruttore PRIVATO cosicchè nessuno (tranne questa stessa classe) possa creare oggetti, l'ho fatto senza argomenti e senza corpo, naturalmente puo contenere quello che vuoi
public static MySingleton getIstance(){ //ritorna l'unica istanza della classe, l'ho fatto senza nessun argomento, puo prendere gli argomenti necessari ad un'eventuale creazione del singleton
if (istance==null) istance=new MySingleton(); //inizzializzazione lazy
return istance; //ritorno l'oggetto
}
//altri metodi di classe
}
Se vuoi sapere altri design pattern da poter usare (sempre in java) puoi andare qui (http://www.dis.uniroma1.it/~mecella/didattica/2007/ProgSw2/Lezioni/L5.pdf).
Ovviamente essendo java gira sia su win che su linux.
No...lui intende un programma (non una classe) che può essere eseguito in una sola istanza...
morskott
28-06-2007, 13:13
una puzzonata sarebbe che all'inizio del programma crea un file (anche vuoto) e alla chiusura lo cancelli, e parte solo se quel determinato file non c'è.
In pseudocodice
if (esiste(mioFile)) esci dal programma
altrimenti crea(mioFile)
//resto del programma
elimina(file)
Prima che mi linciate dico che è un'autentico obbrobbbbbio.
Altrimenti chiedi al sistema di passarti un mutex all'inizio e lo rilasci alla fine, soluzione sicuramente piu elegante ma non so se fattibile
Prima che mi linciate dico che è un'autentico obbrobbbbbio.
Altrimenti chiedi al sistema di passarti un mutex all'inizio e lo rilasci alla fine, soluzione sicuramente piu elegante ma non so se fattibile
Non è un obbrobrio. E' quello che si fa spesso con Linux e lo si va a creare in una parte del disco che ad ogni avvio viene liberata...il problema è che devi riavviare il sistema (o cancellare il file a mano) se il programma ti crasha...
Con la named mutex se il programma crasha la mutex viene automaticamente rilasciata...
morskott
28-06-2007, 13:57
Non è un obbrobrio. E' quello che si fa spesso con Linux e lo si va a creare in una parte del disco che ad ogni avvio viene liberata...il problema è che devi riavviare il sistema (o cancellare il file a mano) se il programma ti crasha...
Con la named mutex se il programma crasha la mutex viene automaticamente rilasciata...
E se crei un programma che fa il check all'avvio del file, in caso affermativo crea un nuovo processo/thread che lancia il programma vero e propio e si mette in attesa del suo termine per poi alla fine cancellare il file, così in caso di crash del programma principale puo cancellare tranquillamente il file?
vBulletin® v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.