Hi,
Post by Jens Köhlerum zu verhindern, das ein Programm mehrfach gestartet wird, habe ich
im Internet ein funktionierende Lösung gefunden. Ein Ausschnitt davon
steht unten. Meine Frage ist, was macht das WaitForSingleObject?
Ich habe zwar die Hilfe gelesen, geholfen hat mir das aber nicht.
Jens
Mutex := CreateMutex(nil, True, MutexName);
if GetLastError = Error_Already_Exists then
begin
if WaitForSingleObject(Mutex, 5000) = Wait_Object_0 then
begin
Ein Mutex stellt ein Synchronisierungsobjekt dar. Derlei gibt es unter
Windows mehrere. Weitere sind beispielsweise Kritische Sektionen
(CriticalSection), Events, Semaphoren oder Waitable Timer.
Kritische Sektionen sind immer nur in einer Programminstanz gültig.
Weiterhin kann man eine Kritische Sektion nicht mehrfach erzeugen. Ein
Thread, welcher einen geschützen Quelltextabschnitt betreten möchte,
muss sich das Eigentum an der Kritischen Sektion sichern
(EnterCriticalSection). Nach seiner Arbeit gibt er die Kritische Sektion
wieder frei (LeaveCriticalSection). Kritische Sektionen stellen die
leichtgewichtigste aller Synchronisationsobjekte dar.
Mutexe, Semaphoren, Events und Waitable Timer hingegen können mit einem
Namen versehen werden. Diese sind dann prozessübergreifend verfügbar.
Wenn dem Namen ein "Global\" vorangestellt ist, gilt das
Synchronisationsobjekt auch über Sessiongrenzen hinweg. Stellt man ein
"Local\" davor so gilt das nur für die aktuelle Session.
Um sich das Eigentum an so einem Objekt zu sichern ruft man eine der
WaitForXXX Methoden auf. Gibt diese Funktion WAIT_OBJECT_0 (oder bei
WaitForMultipleObjects WAIT_OBJECT_X) zurück, so hast Du das Eigentum am
Objekt. Um das Eigentum wieder abzugeben ruft man bei Mutexen
ReleaseMutex und bei Semaphoren ReleaseSemaphore auf.
Das Eigentum an einem Mutex ist immer exklusiv. Nur ein
Prozess/Codeabschnitt kann den Mutex besitzen (im Gegensatz zu einer
kritischen Sektion bei der ein Thread auch mehrfach EnterCriticalSection
aufrufen kann).
Semaphoren wird beim Erzeugen ein Zähler mitgegeben. Genau diese Anzahl
kann dann per WaitForXXX betreten werden.
In Deinem Fall oben, wird versucht den Mutex zu erzeugen. Wenn der Mutex
existiert, wird versucht eine bestimmte Zeit darauf zu warten, denn ein
anderes Programm besitzt diesen Mutex schon. Wenn das Warten nicht
erfolgreich war (wahrscheinlich ein else des If's oben), bricht das
Program ab. CreateMutex wie es oben geschrieben ist, übernimmt sofort
den Besitz (InitialOwner = true).
Sören