Hallo,
Wenn das Programm unter Windows läuft versuche doch mal Mutex zu verwenden. Z.B. so:
Code: Alles auswählen
a = CreateMutex_(0, #True, "TestMutex")
If GetLastError_() = #ERROR_ALREADY_EXISTS
MessageRequester("Mutex", "Existiert schon")
End
EndIf
OpenWindow(0, 0, 0, 640, 480, "Mutex", #PB_Window_SystemMenu)
Repeat
Until WaitWindowEvent() = #PB_Event_CloseWindow
Am einfachsten währe es, wie oben vor dem zum Schreiben öffnen ein Mutex zu erstellen, wenn das nicht klappt, kann momentan nicht gespeichert werden. Der Name des Mutex könnte z.B. dein Programmname und der Dateiname sein damit der Mutexname systemweit einmalig ist und zu deiner Datai ebenso. Eine Datei mit anderen Dateinamen könntest du so trotzdem noch erstellen. Wenn die Datei wieder geschlossen wird muß der Mutex dann wieder mit CloseHandle(MutexHandle) wieder freigegebn werden. (MutextHandle ist das, was bei CreateMutex zurückgegeben wird, im Beispiel also das a).
Eleganter (aber komplizierter) geht es mit den zu den Mutexen gehörigen Waitfunktionen, dann kann das Programm darauf warten, bis ein Mutex freigegeben wird bis es auf die Datei zugreift. Mehr dazu im MSDN.
Trotzdem mal als kleines Beispiel obigen Code mit Wiat - Funktion:
Code: Alles auswählen
a = CreateMutex_(0, #True, "TestMutex")
If GetLastError_() = #ERROR_ALREADY_EXISTS
MessageRequester("Mutex", "Existiert schon")
WaitForSingleObject_(a, #INFINITE)
EndIf
hwnd = OpenWindow(0, 0, 0, 640, 480, "Mutex", #PB_Window_SystemMenu)
CreateGadgetList(hwnd)
ButtonGadget(0, 5, 5, 80, 25, "Close")
Repeat
e = WaitWindowEvent()
If e = #PB_Event_Gadget And EventGadget() = 0
ReleaseMutex_(a)
EndIf
Until e = #PB_Event_CloseWindow
Wenn dieses Programm jetzt mehrfach gestartet wird öffnet sich nur vom ersten das Fenster. Das zweite wartet, bis man beim ersten auf das Close - Gadget klickt. Dann wird das Mutex freigegeben (ReleaseMutex_(MutexHandle)) und das als nächstes gestartete öffnet das Fenster. Allerdings muß man aufpassen, befindet sich WaitForSingleObject() in einer Nachrichtenschleife eines Fensters darf #INFINITE nicht verwendet werden, dann muß stattdessen ein Timeout eingegeben werden um dann die Fensternachrichten bearbeiten zu können oder das Speichern muß in einem Thread geschehen.
Gruß,
Ligatur