Tutorial
Threading
Als Hinweis sei noch erwähnt, das nach der Do-Loop unbedingt auf das Ende der Threads gewartet werden sollte!!! Egal ob das Programm abgebrochen wird, oder nicht.
Alternativ kann hier eine wechselseitige Kommunikation über die Statusvariable erfolgen.
Im einfachsten Falle würde man bei einem Zugriff das Element sperren und anschließend mit den Daten arbeiten.
Sub Bearbeitugnsthread(V_Data as Any Ptr)
'Der Thread kann (muss nicht) im Hauptprogramm schneller erzeugt werden, als es braucht um die Informationen zu speichern
'daher wird im Thread ein Mutexlock durchgeführt, um zu verhindern, das Daten beschädigt werden
MutexLock(XMutex) 'Zuerst das Mutex sperren.
Dim Info as Thread_Type Ptr = Cast(Thread_Type Ptr, V_Data) 'DatenPointer zwischenspeichern
MutexUnLock(XMutex) 'Sperre wieder aufheben
MutexLock(XMutex) 'Mutex sperren.
If Info->V_Image = 0 Then 'Prüfen ob das Bild valid ist.
Info->V_State = 255 'wenn das nicht der Fall ist, dann Status auf 255 setzen (fertig)...
MutexUnLock(XMutex) '...Sperre wieder aufheben...
Exit Sub '... und sub (Thread) verlassen (beenden)
End If
'sind die Daten valid, dann kann weiter gearbeitet werden
'MutexUnLock(XMutex)
End Sub
Wie man sich jedoch denken kann ist ein Zugriff auf diese Art sehr "Blockierend". Ständig das Element zu sperren und wieder zu entsperren ist nicht nur Zeitaufwändig, sondern blockiert die Arbeit von anderen Threads massiv.
Dies lässt sich jedoch auf eine einfache Weise verhindern, indem zusätzlich eine DATEN-Kopie der Informationsstruktur angelegt wird.
Dadurch ist eine Sperrung nicht mehr zwingend erforderlich, da ein anderer Speicherbereich erzeugt wird, in welchem die Daten nun liegen.
Jedoch muss hierbei beachtet werden, das Schreibvorgänge in den neu erzeugten Bereich KEINE Auswirkung auf das eigentliche Array haben.
Sub Bearbeitugnsthread(V_Data as Any Ptr)
'Der Thread kann (muss nicht) im Hauptprogramm schneller erzeugt werden, als es braucht um die Informationen zu speichern
'daher wird im Thread ein Mutexlock durchgeführt, um zu verhindern, das Daten beschädigt werden
MutexLock(XMutex) 'Zuerst das Mutex sperren.
Dim Info as Thread_Type Ptr = Cast(Thread_Type Ptr, V_Data) 'DatenPointer zwischenspeichern
Dim InfoDaten as Thread_Type = *Info 'DATEN-Kopie erzeugen
MutexUnLock(XMutex) 'Sperre wieder aufheben
'Jetzt brauchen wir keine Sperrung mehr durchführen, da die zu lesenden Informationen in einem gesondertem Bereich liegen.
If InfoDaten.V_Image = 0 Then 'Prüfen ob das Bild valid ist.
'Ist ein Schreibvorgang nötig muss jedoch abgewogen werden, wo dessen Ziel sein soll
'In diesem Fall muss es in das Array erfolgen, und kann nicht in unsere temporäre Datenkopie abgelegt werden.
'Das macht den Einsatz einer Mutex-Sperre erforderlich
MutexLock(XMutex) 'Mutex sperren.
Info->V_State = 255 'Status auf 255 setzen (fertig)...
MutexUnLock(XMutex) '...Sperre wieder aufheben...
Exit Sub '... und sub (Thread) verlassen (beenden)
End If
'sind die Daten valid, dann kann weiter gearbeitet werden
End Sub
Gehe zu Seite
1 2 3 4 5
Zusätzliche Informationen und Funktionen |
|
|