Metoda 1: Folosește variabile mutex din fir. Definește variabilele mutex pentru a determina dacă o instanță rulează. Schimbă funcția Main() din fișierul program.cs cu următorul cod:
Notă: În program, instrucțiunea System.Threading.Mutex run = new System.Threading.Mutex(true, "single_test", out runone); pentru a crea o variabilă mutex, run, unde "single_test" este numele mutex, iar când această metodă revine, dacă se creează un mutex local sau un sistem de denumire specificat mutex, valoarea booleană runone este adevărată; fals dacă sistemul de denumire specificat, mutexe, există deja. Mutex-urile denumite sunt la nivelul întregului sistem. Metoda 2: Folosiți modul de judecată a procesului, înainte să rulăm programul, găsim dacă există un proces cu același nume în proces, iar poziția de rulare este tot același proces. Aplică clasa Process în spațiul de nume System.Diagnostics în C# pentru a o implementa, codul principal este următorul: 1. Adaugă o funcție în fișierul program.cs după cum urmează:
2. Schimbă funcția principală () cu următorul cod:
Metoda 3: Metoda atomică globală, înainte de a crea un program, verifică mai întâi tabelul atomic global pentru a vedea dacă există un atom A specific (adăugat la momentul creării) și oprește crearea acestuia când există, indicând că programul a rulat o instanță; Dacă nu există, rulează programul și vrei să adaugi un atom A specific la tabelul atomic global; Când ieși din program, amintește-ți să eliberezi un atom A specific, altfel acesta nu va fi eliberat până când calculatorul nu este oprit. Implementarea C# este următoarea: 1. Declararea interfeței funcției WinAPI
[System.Runtime.InteropServices.DllImport("kernel32.dll")] extern static public UInt32 GlobalAddAtom(String lpString); Adaugă atomi [System.Runtime.InteropServices.DllImport("kernel32.dll")] extern static public UInt32 GlobalFindAtom(String lpString); Găsește atomi [System.Runtime.InteropServices.DllImport("kernel32.dll")] extern static public UInt32 GlobalDeleteAtom(UInt32 nAtom); Șterge atomii 2. Modifică funcția Main() astfel:
3. Adaugă următorul cod la evenimentul FormCloseded: GlobalDeleteAtom(GlobalFindAtom("jiaao_test")); Șterge "jiaao_test" atomică --------------------------------------*-------*--------*----------------------------------------------- Cea de mai sus este ideea generală de bază a creării unui program mutual exclusiv și, personal, cred că prima metodă este cea mai simplă. |