Anche il codice qui sotto è sbagliato!! Codice corretto come sopra!!
A volte dobbiamo permettere che venga eseguita una sola istanza dell'applicazione e, quando il processo avvia, se scopre che un'istanza dell'applicazione è in esecuzione, si interrompe automaticamente. Di solito la implementiamo nella funzione Main tramite un mutex Mutex, che di solito si scrive:
Quando cerchiamo risposte, spesso entriamo e andiamo in fretta, ignorando le caratteristiche e le precauzioni di Mutex. Dopo un semplice test, ok, fallo e usalo. A questo punto, trascuriamo un prerequisito importante:Convenzioni di denominazione mutex. Il metodo di scrittura sopra descritto funziona senza alcun problema sotto un solo utente; Nel multi-utente, ogni utente può avviare un'istanza, quindi non è garantito che una singola istanza sia garantita.
Se devi usarlo su un terminal server e permetti solo un'istanza, usa il seguente metodo:
Ecco la descrizione della MSDN:
Sui server che eseguono servizi terminal, il mutex di sistema denominato può avere due livelli di visibilità. Se il nome inizia con il prefisso "Global\", il mutex è visibile in tutte le sessioni del terminal server. Se il nome inizia con il prefisso "Local\", il mutex è visibile solo nella sessione del terminal server che lo ha creato. In questo caso, ogni altra sessione del terminal server sul server può avere un mutex separato con lo stesso nome. Se crei un mutex con nome senza specificare un prefisso, prenderà il prefisso "Local\". In una sessione di server terminale, due mutex con prefissi di nome diversi sono mutex indipendenti, e i due mutex sono visibili a tutti i processi nella sessione del server terminale. Cioè, i nomi prefissi "Global" e "Local" descrivono l'intervallo del nome mutex rispetto alla sessione del terminal server, non al processo.
|