Qnode hat geschrieben:Mit dem Mutex [...] vorsichtshalber auch noch alle anderen Dateioperationen gewrappt (z.B. ExamineDirectory). Ist das sinnvoll oder programmiertechnisch ein wildes UmSichSchlagen?
Aktuell macht es Sinn, weil du für die Datei- und Verzeichnisoperationen feste ID-Nummern verwendest und jeder Thread sich beim anderem Thread in den Prozess einmischen würde. Lösen könntest du das Problem mit
#PB_Any. Mit dieser Konstante generiert PB immer eine neue ID-Nummer.
Einige deiner Procedures verwendet die globale Liste
CurrentLogFiles(), weshalb sie per einem Mutex geschützt werden müssen. In diesem Fall bringt dir das oben erwähnte Umstellen auf
#PB_Any also nichts.
Ich versuche mal die Problematik mit Threads zu veranschaulichen, damit du es besser verstehen kannst.
Führe folgenden Code mit gesetzter Compiler-Option "Thread-sicheres Executable" aus:
Code: Alles auswählen
Global NewList Values()
Global StopThreads
Define Thread1, Thread2
AddElement(Values()) : Values() = 1
AddElement(Values()) : Values() = 2
Procedure PrintListContent(ThreadNumber)
Repeat
ForEach Values()
Debug "Thread " + Str(ThreadNumber) + ": " + Str(Values())
Next
Until StopThreads
EndProcedure
Thread1 = CreateThread(@PrintListContent(), 1)
Thread2 = CreateThread(@PrintListContent(), 2)
Delay(1) ; ca. 1 Millisekunde warten
StopThreads = #True
WaitThread(Thread1)
WaitThread(Thread2)
End
Ein Ausschnitt meiner Debug-Ausgabe:
Code: Alles auswählen
Thread 2: 1
Thread 1: 1
Thread 1: 1 <= 1 anstatt 2
Thread 1: 2 <= Jetzt kommt plötzlich die zuvor erwartete 2
Thread 2: 2
Thread 1: 1
Thread 2: 2 <= Thread-2, wo ist die 1?
Wie du sehen kannst, kommt der Prozess ziemlich durcheinander, wenn zwei Threads auf die gleiche Ressource (hier die Liste) zugreifen.
Mit einem Mutex kannst du wieder für Ordnung sorgen:
Code: Alles auswählen
Global Mutex = CreateMutex()
Procedure PrintListContent(ThreadNumber)
Repeat
LockMutex(Mutex)
ForEach Values()
Debug "Thread " + Str(ThreadNumber) + ": " + Str(Values())
Next
UnlockMutex(Mutex)
Until StopThreads
EndProcedure
Code: Alles auswählen
Thread 1: 1
Thread 1: 2
Thread 1: 1
Thread 1: 2
Thread 2: 1
Thread 2: 2
Qnode hat geschrieben:; + Copyright: this is freeware
Die Programmierer verzichten bei Freeware nur auf eine Nutzungsvergütung, aber nicht auf das Urheberrecht. Den Benutzern wird nur ein Nutzungsrecht eingeräumt; Änderungen der Software oder die Nutzung der Teile des Programms (wie etwa Codeschnipsel) werden untersagt. Freewareprogramme können frei kopiert und weitergegeben werden.
Quelle:
https://de.wikipedia.org/wiki/Freeware
Stimmt das mit deiner Absicht überein?