Verwendung Mutex ?

Für allgemeine Fragen zur Programmierung mit PureBasic.
IronEagle
Beiträge: 64
Registriert: 13.10.2012 14:41
Wohnort: Berlin

Verwendung Mutex ?

Beitrag 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 ?
PureBasic 5.71 | Windows 10 Home (x64)
Benutzeravatar
Bisonte
Beiträge: 2476
Registriert: 01.04.2007 20:18

Re: Verwendung Mutex ?

Beitrag 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.... ;)
PureBasic 6.21 (Windows x86/x64) | Windows11 Pro x64 | AsRock B850 Steel Legend Wifi | R7 9800x3D | 64GB RAM | GeForce RTX 5080 | ThermaltakeView 270 TG ARGB | build by vannicom​​
Benutzeravatar
STARGÅTE
Kommando SG1
Beiträge: 7039
Registriert: 01.11.2005 13:34
Wohnort: Glienicke
Kontaktdaten:

Re: Verwendung Mutex ?

Beitrag 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.
PB 6.01 ― Win 10, 21H2 ― Ryzen 9 3900X, 32 GB ― NVIDIA GeForce RTX 3080 ― Vivaldi 6.0 ― www.unionbytes.de
Aktuelles Projekt: Lizard - Skriptsprache für symbolische Berechnungen und mehr
Benutzeravatar
ts-soft
Beiträge: 22292
Registriert: 08.09.2004 00:57
Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel
Wohnort: Berlin

Re: Verwendung Mutex ?

Beitrag 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.
PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.
Bild
IronEagle
Beiträge: 64
Registriert: 13.10.2012 14:41
Wohnort: Berlin

Re: Verwendung Mutex ?

Beitrag 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 :)
PureBasic 5.71 | Windows 10 Home (x64)
Benutzeravatar
Bisonte
Beiträge: 2476
Registriert: 01.04.2007 20:18

Re: Verwendung Mutex ?

Beitrag 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 ....
PureBasic 6.21 (Windows x86/x64) | Windows11 Pro x64 | AsRock B850 Steel Legend Wifi | R7 9800x3D | 64GB RAM | GeForce RTX 5080 | ThermaltakeView 270 TG ARGB | build by vannicom​​
IronEagle
Beiträge: 64
Registriert: 13.10.2012 14:41
Wohnort: Berlin

Re: Verwendung Mutex ?

Beitrag 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 :bounce:
PureBasic 5.71 | Windows 10 Home (x64)
Antworten