Ο παρακάτω κώδικας είναι επίσης λάθος!! Σωστός κωδικός όπως παραπάνω!!
Μερικές φορές χρειάζεται να επιτρέψουμε την εκτέλεση μόνο μιας παρουσίας της εφαρμογής και όταν ξεκινήσει η διαδικασία, εάν διαπιστώσει ότι εκτελείται μια παρουσία της εφαρμογής, θα σταματήσει αυτόματα να εκτελείται. Συνήθως το υλοποιούμε στην κύρια συνάρτηση μέσω ενός Mutex mutex, το οποίο συνήθως γράφεται:
Όταν αναζητούμε απαντήσεις, συχνά πηγαινοερχόμαστε βιαστικά, αγνοώντας τα χαρακτηριστικά και τις προφυλάξεις του Mutex. Μετά από ένα απλό τεστ, ΟΚ, πάρτε το και χρησιμοποιήστε το. Σε αυτό το σημείο, παραβλέπουμε μια σημαντική προϋπόθεση:Συμβάσεις ονομασίας Mutex. Η παραπάνω μέθοδος γραφής λειτουργεί χωρίς προβλήματα σε έναν μόνο χρήστη. Στην περιοχή πολλών χρηστών, κάθε χρήστης μπορεί να ξεκινήσει μία παρουσία, επομένως δεν είναι εγγυημένη μια μεμονωμένη παρουσία.
Εάν πρέπει να το χρησιμοποιήσετε σε ένα διακομιστή τερματικού και να επιτρέψετε μόνο μία παρουσία, χρησιμοποιήστε την ακόλουθη μέθοδο:
Ακολουθεί η περιγραφή του MSDN:
Σε διακομιστές που εκτελούν υπηρεσίες τερματικού, το όνομα system mutex μπορεί να έχει δύο επίπεδα ορατότητας. Αν το όνομα αρχίζει με το πρόθεμα "Global\", το mutex είναι ορατό σε όλες τις συνεδρίες του εξυπηρετητή τερματικού. Εάν το όνομα ξεκινά με το πρόθεμα "Local\", το mutex είναι ορατό μόνο στην περίοδο λειτουργίας του διακομιστή τερματικού που το δημιούργησε. Σε αυτήν την περίπτωση, κάθε άλλη περίοδος λειτουργίας διακομιστή τερματικού στο διακομιστή μπορεί να έχει ξεχωριστό mutex με το ίδιο όνομα. Εάν δημιουργήσετε ένα όνομα mutex χωρίς να καθορίσετε ένα πρόθεμα, θα πάρει το πρόθεμα "Local\". Σε μια περίοδο λειτουργίας διακομιστή τερματικού, δύο mutex με διαφορετικά προθέματα ονόματος είναι ανεξάρτητα mutex και τα δύο mutex είναι ορατά σε όλες τις διεργασίες στην περίοδο λειτουργίας του διακομιστή τερματικού. Δηλαδή, τα ονόματα προθέματος "Global" και "Local" περιγράφουν το εύρος του ονόματος mutex σε σχέση με την περίοδο λειτουργίας του τερματικού διακομιστή και όχι με τη διαδικασία.
|