Trädvy Permalänk
Inaktiv
Registrerad
Sep 2011

Python threading problem.

Sitter och försöker få följande kodsnutt att fungera.
Problemet är att när tråden ska köras fastnar den i while-loopen och fortsätter inte med huvudkoden. Vad har jag missat?

#!/usr/bin/python3 import argparse, time, sys, os, rgbmatrix, threading, queue from rgbmatrix import graphics from rgbmatrix import RGBMatrix class LedText: def __init__(self): self.DEFAULTFONT = "fonts/6x10.bdf" self.msg = None self.color = graphics.Color(255, 0 ,0) self.x = 0 self.y = 0 self.matrix = RGBMatrix(16, 1, 1) self.matrix.pwmBits = 11 self.matrix.brightness = 20 self.matrix.luminanceCorrect = False self.canvas = self.matrix; self.font = graphics.Font() self.font.LoadFont(self.DEFAULTFONT) def SetText(self, msgIn): self.msg = msgIn def SetColor(self, r, g, b): self.color = graphics.Color(r, g ,b) def SetPos(self, x, y): self.x = x self.y = y def SetFont(self, font): fontPath = "fonts/"+font if (path.isfile(fontPath)): self.font.LoadFont(fontPath) else: self.font.LoadFont(self.DEFAULTFONT) def Clear(self): self.matrix.Clear() def Update(self): print("Tråden") while True: time.sleep(0.1) self.Clear() f=open("data") text=f.read() f.close graphics.DrawText(self.canvas, self.font, self.x, self.y, self.color, text) if __name__ == "__main__": threads = [] count=0 led=LedText() led.SetPos(5,10) led.SetText("test") print("Innan tråden") t = threading.Thread(target=led.Update()) threads.append(t) t.start() print("Efter tråden") while True: count += 1 c = str(count) print("Test om vi är igång efter start av thread: " + c) time.sleep(1)

Trädvy Permalänk
Medlem
Plats
Uppsala
Registrerad
Apr 2006

Testa att ändra

t = threading.Thread(target=led.Update())

till

t = threading.Thread(target=led.Update)

[Moderkort: MSI Z68A-GD55 G3 B3] [Nätagg: Corsair AX 750W]
[Minne: 8GB Corsair Vengeance 1600Mhz] [Grafikkort: ASUS GTX 970]
[Processor: i5 2500k @ 4.5GHz (1.2850V) med H100-kylning] [Hårddisk: Samsung 840 Basic 250GB + lagringsdiskar]

Trädvy Permalänk
Medlem
Plats
Moon
Registrerad
Aug 2007

t = threading.Thread(target=led.Update())

Ska vara

t = threading.Thread(target=led.Update)

Problemet är att du kallar funktionen Update där, när du bara borde skicka en reference.

Trädvy Permalänk
Inaktiv
Registrerad
Sep 2011
Skrivet av EagiZ:

Testa att ändra

t = threading.Thread(target=led.Update())

till

t = threading.Thread(target=led.Update)

Skrivet av Snowy86:

t = threading.Thread(target=led.Update())

Ska vara > t = threading.Thread(target=led.Update)

Haha ni har så rätt! Verkar fungera nu
Tack för hjälpen!

Trädvy Permalänk
Medlem
Plats
Uppsala
Registrerad
Apr 2006

Anledningen till att det inte fungerade tidigare var för att du (omedvetet) gav returvärdet av led.Update som input till threading.Thread, som då Python måste räkna ut med main-tråden (vilket aldrig terminerar).

[Moderkort: MSI Z68A-GD55 G3 B3] [Nätagg: Corsair AX 750W]
[Minne: 8GB Corsair Vengeance 1600Mhz] [Grafikkort: ASUS GTX 970]
[Processor: i5 2500k @ 4.5GHz (1.2850V) med H100-kylning] [Hårddisk: Samsung 840 Basic 250GB + lagringsdiskar]