Seite 1 von 1
Verwendung Mutex ?
Verfasst: 12.03.2014 19:21
von IronEagle
Verwendung Mutex ?
Hallo Leute,
ich habe mal eine allgemeine Frage zu den Mutex-Befehlen.
Muss ich LockMutex() / UnlockMutex() verwenden wenn ich neben meines Hauptprogramms nur einen Thread laufen habe?
Ich habe folgenden Code geschrieben um einen Zähler auf ein CanvasGadget zu zeichnen.
Code: Alles auswählen
Protected DrawingTimer.l, RefDrawingTimer.l
LockMutex(TimerMutex)
While TimerThread.b = #True
If (((ElapsedMilliseconds() - StartTimer.l) + SavedTimer.l) / 1000) <> RefDrawingTimer.l
If StartDrawing(CanvasOutput(#Canvas_0))
DrawingMode(#PB_2DDrawing_Transparent)
DrawingTimer.l = (ElapsedMilliseconds() - StartTimer.l) + SavedTimer.l
RefDrawingTimer.l = (DrawingTimer.l / 1000)
DrawText(390, 20, DrawingTimer.l, RGB(0, 0, 0))
StopDrawing()
EndIf
EndIf
Wend
UnlockMutex(TimerMutex)
Wäre dieser, bezogen auf die Mutex-Befehle, korrekt wenn ich gleichzeitig im Hauptprogramm die Variablen StartTimer.l, SavedTimer.l, TimerThread.b verändere ?
Re: Verwendung Mutex ?
Verfasst: 12.03.2014 19:56
von Bisonte
Da ich das ganze Programm so nicht sehen kann, und Du sagst, du hättest nur einen Thread... Versuche doch ohne Thread das Problem zu lösen.
Von dem Schnipsel den Du gepostet hast würd ich sagen, dass deine Lock und UnlockMutexe falsch sind. Aber es ist ja nicht der ganze Code.... (Wahrscheinlich völlig aus dem Zusammenhang gerissen.
Und nebenbei, wenn du den Hintergrund nicht löscht, in dem Canvas, hast Du da nach 3 oder 4 Änderungen nur noch Zahlensalat zu sehen....

Re: Verwendung Mutex ?
Verfasst: 12.03.2014 20:14
von STARGÅTE
Muss ich LockMutex() / UnlockMutex() verwenden wenn ich neben meines Hauptprogramms nur einen Thread laufen habe?
Kann man pauschal nicht sagen.
Wenn es zwischen dem Thread und deinem Hauptprogramm keinen Datenaustausch gibt (in Form von Variablen, Liste o.ä.) brauchst du keine Mutex.
Wenn du allerdings Variablen hast die in Thread und Hauptprogramm benutzt werden, dann musst du diese schützen, sodass Thread und Hauptpgrogramm nicht gleichzeitig schreiben.
Re: Verwendung Mutex ?
Verfasst: 12.03.2014 20:24
von ts-soft
Ergänzend:
Das Hauptprogramm oder der Process besteht ja von Hause aus, schon aus einem Thread, dem Mainthread.
Das wird leicht übersehen, da es bei einem Thread, dem Mainthread ja keine Probleme geben kann, aber sobald
ein Thread erzeugt wird, existieren effektiv schon 2 Threads die sich gegenseitig den Speicher zerhämmern können.
Re: Verwendung Mutex ?
Verfasst: 12.03.2014 22:34
von IronEagle
Von dem Schnipsel den Du gepostet hast würd ich sagen, dass deine Lock und UnlockMutexe falsch sind. Aber es ist ja nicht der ganze Code.... (Wahrscheinlich völlig aus dem Zusammenhang gerissen.
Ich hatte nur die die Prozedur gepostet, die als Thread läuft. Vlt. Ist es verständlicher wenn ich den Anfang und das Ende der Prozedur poste. Ich frage mich ob ich die Mutex-Befehle an der richtigen Stelle habe? Und muss ich nun auch im Hauptprogramm Mutex-Befehle verwenden wenn ich auf gemeinsam verwendete Variablen zugreife ?
Code: Alles auswählen
Procedure DrawProjectTimer(*ThreadID)
Protected DrawingTimer.l, RefDrawingTimer.l
LockMutex(TimerMutex)
While TimerThread.b = #True
If (((ElapsedMilliseconds() - StartTimer.l) + SavedTimer.l) / 1000) <> RefDrawingTimer.l
If StartDrawing(CanvasOutput(#Canvas_0))
DrawingMode(#PB_2DDrawing_Transparent)
DrawingFont(FontID(DrawingFontID.l))
Box(0, 0, 980, 290, RGB(255, 255, 255))
DrawingTimer.l = (ElapsedMilliseconds() - StartTimer.l) + SavedTimer.l
RefDrawingTimer.l = (DrawingTimer.l / 1000)
DrawText(390, 20, Str(DrawingTimer.l / 1000), RGB(0, 0, 0))
StopDrawing()
EndIf
EndIf
Wend
UnlockMutex(TimerMutex)
EndProcedure
Und nebenbei, wenn du den Hintergrund nicht löscht, in dem Canvas, hast Du da nach 3 oder 4 Änderungen nur noch Zahlensalat zu sehen....
Ich hatte die Prozedur etwas vereinfacht, aber an sich hast du natürlich recht

Re: Verwendung Mutex ?
Verfasst: 12.03.2014 23:45
von Bisonte
Du musst den Mutex um Variablenmanipulation herum setzen. Aber auch nur wenn Variablen manipuliert werden, die
in dem Thread benutzt werden.
Bei dieser Prozedur scheint der Mutex keinen Sinn zu machen, da nur die Variablen DrawingTimer.l und RefDrawingTimer.l
verändert werden... diese aber Protected sind, will heissen, von der Aussenwelt abgeschottet.
Auf alle anderen Variablen greifst du nur lesend zu, also kein Mutex nötig.
...Und wieder nebenbei

: Benutze zumindest bei "ID's", also OS-Handles (hier die FontID), Integer als Variablentyp. Es kann bei 64Bit die Fehlersuche stark
eingrenzen ....
Re: Verwendung Mutex ?
Verfasst: 12.03.2014 23:50
von IronEagle
ok super, ich denke jetzt habe ich es verstanden wann ich einen Mutex sinnvoll einsetze
...Und wieder nebenbei

: Benutze zumindest bei "ID's", also OS-Handles (hier die FontID), Integer als Variablentyp. Es kann bei 64Bit die Fehlersuche stark
eingrenzen ....
Werde ich beherzigen, vielen Dank
@ All Danke für eure schnelle Hilfe
