De onderstaande code is ook fout!! Correcte code zoals hierboven!!
Soms moeten we slechts één instantie van de applicatie laten draaien, en wanneer het proces start, als het merkt dat een instantie van de applicatie draait, stopt het automatisch met draaien. We implementeren het meestal in de Main-functie via een Mutex-mutex, die meestal als volgt wordt geschreven:
Wanneer we naar antwoorden zoeken, komen en gaan we vaak haastig, waarbij we de kenmerken en voorzorgsmaatregelen van Mutex negeren. Na een simpele test, oké, neem het en gebruik het. Op dit punt negeren we een belangrijke vereiste:Mutex naamgevingsconventies. De bovenstaande schrijfmethode werkt zonder problemen onder één enkele gebruiker; Bij multi-user kan elke gebruiker één instantie starten, dus één enkele instantie kan niet gegarandeerd worden.
Als je het op een terminalserver moet gebruiken en slechts één instantie toestaat, gebruik dan de volgende methode:
Hier is de beschrijving van MSDN:
Op servers die terminalservices draaien, kan benoemde systeemmutex twee zichtniveaus hebben. Als de naam begint met het voorvoegsel "Global\", is de mutex zichtbaar in alle terminalserversessies. Als de naam begint met het voorvoegsel "Local\", is de mutex alleen zichtbaar in de terminalserversessie die het heeft aangemaakt. In dit geval kan elke andere terminalserversessie op de server een aparte mutex met dezelfde naam hebben. Als je een benoemde mutex aanmaakt zonder een prefix te specificeren, krijgt hij het prefix "Local\". In een terminalserversessie zijn twee mutexen met verschillende naamprefixen onafhankelijke mutexen, en de twee mutexen zijn zichtbaar voor alle processen in de terminalserversessie. Dat wil zeggen, de voorvoegsels "Globaal" en "Lokaal" beschrijven het bereik van de mutexnaam ten opzichte van de terminalserversessie, niet van het proces.
|