|
|
|
![]() |
|
Strumenti |
![]() |
#1 |
Senior Member
Iscritto dal: Oct 2005
Messaggi: 3306
|
Programma con un'unica istanza
Cosa bisogna fare per creare un programma "singleton"?
Magari il modo per farlo sia su Windows che su Linux. |
![]() |
![]() |
![]() |
#2 |
Senior Member
Iscritto dal: Apr 2000
Città: Roma
Messaggi: 15625
|
Su linux, il modo pulito (che usano quasi tutti) è utilizzare un pid file (v. /var/run)
__________________
0: or %edi, %ecx; adc %eax, (%edx); popf; je 0b-22; pop %ebx; fadds 0x56(%ecx); lds 0x56(%ebx), %esp; mov %al, %al andeqs pc, r1, #147456; blpl 0xff8dd280; ldrgtb r4, [r6, #-472]; addgt r5, r8, r3, ror #12 |
![]() |
![]() |
![]() |
#3 |
Senior Member
Iscritto dal: Nov 2005
Città: TO
Messaggi: 5206
|
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.
__________________
Andrea, SCJP 5 (91%) - SCWCD 5 (94%) |
![]() |
![]() |
![]() |
#4 |
Senior Member
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
|
Su Windows dovrebbe bastare una named mutex creata con CreateMutex...
|
![]() |
![]() |
![]() |
#5 | |
Member
Iscritto dal: Jul 2005
Messaggi: 282
|
Quote:
Codice:
public 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 } Ovviamente essendo java gira sia su win che su linux. |
|
![]() |
![]() |
![]() |
#6 |
Senior Member
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
|
No...lui intende un programma (non una classe) che può essere eseguito in una sola istanza...
|
![]() |
![]() |
![]() |
#7 |
Member
Iscritto dal: Jul 2005
Messaggi: 282
|
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 Codice:
if (esiste(mioFile)) esci dal programma altrimenti crea(mioFile) //resto del programma elimina(file) Altrimenti chiedi al sistema di passarti un mutex all'inizio e lo rilasci alla fine, soluzione sicuramente piu elegante ma non so se fattibile |
![]() |
![]() |
![]() |
#8 | |
Senior Member
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
|
Quote:
Con la named mutex se il programma crasha la mutex viene automaticamente rilasciata... |
|
![]() |
![]() |
![]() |
#9 | |
Member
Iscritto dal: Jul 2005
Messaggi: 282
|
Quote:
|
|
![]() |
![]() |
![]() |
Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 00:47.