Threads


Die Betriebssysteme sind heutzutage so leistungsfähig, dass man mehrere Programme parallel laufen lassen kann (Multitasking). Da meist nur ein Prozessor zur Verfügung steht, wird dies durch eine schnelle Umschaltung zwischen den Prozessen erreicht. Auch Teile eines Programms können auf mehrere Prozesse aufgeteilt werden. Man spricht dabei von Threads.

Beispiel 1: Ohne Verwendung von Threads können zwei Turtle nicht gleichzeitig zeichnen sondern nur abwechlungsweise. Unter Verwendung von Threads können die beiden Turtle gleichzeitig zeichnen. Mit dem Aufruf der Funktion go() wird für jede Turtle ein eigener Thread erzeugt. Dieser enthält die Methode draw(), in welcher das Zeichnen der Stufen erfolgt.

 

# ThreadEx1.py

from gturtle import *
from thread import start_new_thread

def go(t):
    start_new_thread(draw, (t, ))

def draw(t):
    for i in range(8):
        step(t)
    
def step(t):    
    t.forward(20)
    t.left(90)
    t.forward(20)
    t.right(90)

tf = TurtleFrame()
john = Turtle(tf)
laura = Turtle(tf)
laura.setColor("red")
laura.setPenColor("red")
laura.setPos(0, 160)
laura.left(90)
go(john)
go(laura)
Programmcode markieren (Ctrl+C kopieren, Ctrl+V einfügen)

 

Erklärungen zum Programmcode:

start_new_thread(draw, (t, ))Der Thread wird durch Aufruf der Methode start_new_thread() gestartet. Diese führt die Funktion draw() aus. Die zugehörige Parameterliste muss mehr als ein Element enthalten, deswegen das Komma und die Leerstelle

 

Beispiel 2:Im folgenden Beispiel zeichnen drei Turtles gleichzeitig Quadrate.


# ThreadEx2.py

from gturtle import *
from thread import start_new_thread

def go(t):
    start_new_thread(draw, (t, ))

def draw(t):
    for i in range(5):
        square(t)
    
def square(t):    
    for i in range(4):
        t.forward(40).right(90)
    t.forward(40)

tf = TurtleFrame()
john = Turtle(tf)
laura = Turtle(tf, "red")
sara = Turtle(tf, "green")
john.setPos(-100, -100)
laura.setPos(-20, -100)
sara.setPos(60, -100)
laura.setPenColor("red")
sara.setPenColor("green")
go(john)
go(laura)
go(sara)
Programmcode markieren (Ctrl+C kopieren, Ctrl+V einfügen)
 

 

Beispiel 3:Noch ein schönes Beispiel mit drei Turtlen.

# ThreadEx3.py

from gturtle import *
from thread import start_new_thread

def go(t):
    start_new_thread(draw, (t, ))

def draw(t):
    for i in range(9):
        segment(t);
    
def segment(t):    
    t.forward(140)
    t.right(160)

tf = TurtleFrame()
john = Turtle(tf)
laura = Turtle(tf, "red")
sara = Turtle(tf, "green")
john.setPos(-140, -100)
laura.setPos(-20, -100)
sara.setPos(100, -100)
laura.setPenColor("red")
sara.setPenColor("green")
go(john)
go(laura)
go(sara)
Programmcode markieren (Ctrl+C kopieren, Ctrl+V einfügen)
 

 

Im folgenden Beispiel wird an der Stelle des Mausklicks eine neue Turtle erzeugt und diese zeichnet einen Stern. Da jede Turtle im eigenen Thread zeichnet, können gleichzeitig beliebig viele zeichnende Turtles erzeugt werden.

# ThreadEx4.py

from gturtle import *
from thread import start_new_thread

def onMousePressed(e):
    t = Turtle(tf)
    t.setScreenPos(e.getPoint())
    start_new_thread(star, (t, ))

def star(t):
    t.startPath()
    for i in range(9):
        t.fd(70).rt(160)
    t.fillPath()
    
tf = TurtleFrame(mousePressed = onMousePressed)
tf.addStatusBar(20)
tf.setStatusText("Click to create a new star")
Programmcode markieren (Ctrl+C kopieren, Ctrl+V einfügen)
 

 

Erklärungen zum Programmcode:

tf = TurtleFrame(mousePressed = mousePressed) Die Mausevents werden im TurtleFrame registriert
t = Turtle(tf) Die Turtles erscheinen im gleichen TurtleFrame
while True: Eine endlose Schleife: Die Turtles zeichnen so lange ihre Sterne, bis das Programm abgebrochen wird
setScreenPos(e.getPoint())  Mit der Methode getPoint() werden die Koordinaten des Mausklicks abgerufen. Die Methode setScreenPos() rechnet die Bildschirm-Koordinaten in Turtlekoordinaten um
start_new_thread(star, (t, )) Für jede Turtle wird ein neuer Thread erzeugt, der die Funktion star() aufgeruft

 

Beispiel 5: Verwendet man mouseHit, so wird jede per Mausklick erzeugte Turtle bereits in eigenem Thread erzeugt. Dadurch vereinfacht sich der Programmcode:

# ThreadsEx5.py

from gturtle import *

def onMouseHit(x, y):
    t = Turtle(tf)
    t.setPos(x, y) 
    star(t)

def star(t):
    t.startPath()
    for i in range(9): 
        t.fd(70).rt(160)
    t.fillPath()    

tf = TurtleFrame(mouseHit = onMouseHit)
tf.addStatusBar(20)
tf.setStatusText("Click to create a new star")
Programmcode markieren (Ctrl+C kopieren, Ctrl+V einfügen)
 

 


Aufgaben Serie 18

 

1)

Zwei Turtles zeichnen gleichzeitig eine Figur, die aus Quadraten verschiedener Grösse besteht.

 

 

2)

Vier Turtles zeichnen gleichzeitig Treppen und füllen die Fläche unter der Treppenlinie mit ihren Stiftfarben.

 

 

3)

Mit jedem Mausklick wird eine neue Turtle erzeugt. Das Zeichnen der Blumen erfolgt für jede Turtle im eigenen Thread. Dadurch können gleichzeitig beliebig viele zeichnende Turtles erzeugt werden.