' Mandelbrot mit Threads Enum Zeilenstat zuErledigen inArbeit erledigt End Enum Type Komplex r As Double i As Double Declare Constructor() Declare Constructor(r As Double, i As Double) Declare Function betragHoch2() As Double End Type Type GfxThreadSafe Private: mGFX As Any Ptr Public: Declare Constructor(x As Integer, y As Integer) Declare Destructor() Declare Sub tsPset(x As Integer, y As Integer, f As Integer) End Type Constructor Komplex() r = 0.0 i = 0.0 End Constructor Constructor Komplex(r As Double, i As Double) This.r = r This.i = i End Constructor Function Komplex.betragHoch2() As Double Return r * r + i * i End Function Operator+(s1 As Komplex, s2 As Komplex) As Komplex Return Komplex(s1.r + s2.r, s1.i + s2.i) End Operator Operator*(f1 As Komplex, f2 As Komplex) As Komplex Return Komplex(f1.r * f2.r - f1.i * f2.i, f1.r * f2.i + f2.r * f1.i) End Operator Constructor GfxThreadSafe(x As Integer, y As Integer) mGFX = MutexCreate MutexLock mGFX ScreenRes x, y, 4 Width x \ 8, y \ 16 MutexUnLock mGFX End Constructor Destructor GfxThreadSafe() MutexDestroy mGFX End Destructor Sub GfxThreadSafe.tsPset(x As Integer, y As Integer, f As Integer) MutexLock mGFX PSet (x, y), f MutexUnLock mGFX End Sub Const BREITE As Integer = 640 Const HOEHE As Integer = 480 Const xMin As Double = -0.2132605 Const xMax As Double = -0.1868852 Const yMax As Double = -0.6727148 Const rMax As Integer = 30000 Const NTHREADS As Integer = 10 Dim Shared z0 As Komplex = Komplex(0.4, 0.5) Dim Shared s As Double Dim Shared mZeiMgr As Any Ptr, zeiverw(0 To HOEHE) As Zeilenstat Dim Shared bilds As GfxThreadSafe = GfxThreadSafe(640, 480) Sub BerechneZeile(y As Integer) Dim x As Integer Dim z As Komplex, c As Komplex Dim r As Integer For x = 0 To BREITE - 1 c = Komplex(xMin + s * CDbl(x), yMax - s * CDbl(y)) z = z0 r = 0 While r < rMax And z.betragHoch2() < 4.0 z = z * z + c r += 1 Wend If r < rMax Then bilds.tsPset x, y, r Mod 15 Else bilds.tsPset x, y, 15 EndIf Next x End Sub Sub Arbeiter(ByVal p As Any Ptr) Dim y As Integer Do y = 0 MutexLock mZeiMgr While y < HOEHE And zeiverw(y) <> zuErledigen y += 1 Wend If y < HOEHE Then zeiverw(y) = inArbeit EndIf MutexUnLock mZeiMgr If y < HOEHE Then BerechneZeile y MutexLock mZeiMgr zeiverw(y) = erledigt MutexUnLock mZeiMgr EndIf Loop Until y = HOEHE End Sub Dim worker(NTHREADS - 1) As Any Ptr, i As Integer s = (xMax - xMin) / CDbl(BREITE) For i = 0 To HOEHE zeiverw(i) = zuErledigen Next i mZeiMgr = MutexCreate For i = 0 To NTHREADS - 1 worker(i) = ThreadCreate(@Arbeiter) Next i For i = 0 To NTHREADS - 1 ThreadWait worker(i) Next i MutexDestroy mZeiMgr Sleep