Forum: PC-Programmierung Multithreading in Python 3.7 bzw. PyQt4


von python (Gast)


Lesenswert?

Hallo,

folgende Aufgabenstellung möchte ich lösen, dazu ist mir bis jetzt nur 
Multithreading als Lösungsweg eingefallen.

Ich habe mir in PyQt4 ein QLineedit und einen QTextbrowser erstellt.
Ich möchte das diese beiden Widgets unabhängig voneinanderr sind. Das 
bedeutet ich möchte parallel Daten per QTextbrwser anzeigen lassen und 
Daten über das Lineedit senden.

Von der Struktur her müsste die Ausgabe über den Textbrowser ein 
Unterthread vom Hauptthread sein. Der Unterthread soll sich auch über 
ein  ein SIGNAL von z.B. einm Button ausschalten lassen.
1
import _thread, time
2
3
thread_control = True
4
5
6
def bla():
7
    global thread_control
8
    a = 0
9
    while thread_control:
10
        a+=1
11
        print(a)
12
13
14
_thread.start_new_thread(bla,())
15
time.sleep(3)
16
thread_control = False
Das läuft bis jetzt, ist aber im OOP Ansatz nicht anwendbar. Übrig 
bleibden noch das threading Modul oder QThread.

Falls jemand ein paar einfache Codebeispiel zu dem Thema hätte, wäre das 
sehr nett.

von Sven B. (scummos)


Lesenswert?

Vergiss Threads in diesem Fall, die sind der falsche Ansatz. Für sowas 
gibt's die Event Loop. Threads sind hier unnötig.

Aber erklär' nochmal genauer was du machen willst, das habe ich nicht 
ganz verstanden.

Python 3.7 gibt es übrigens nicht.

: Bearbeitet durch User
von python (Gast)


Lesenswert?

Sorry, 3.4 ^^.

Ich habe einen Inputstream und einen Outputstream aus meinem Programm. 
Ich möchte auf beide parallel zugreifen. Also senden während ich 
empfange und empfangen während ich sende.

Ich wollte eine Empfangschleife bauen die durchgehend empfängt und diese 
in einen zweiten Thread auslagern, während ich im Hauptthread neben 
anderen Dingen auch senden kann.
Ich hoffe das ist verständlicher?

von python (Gast)


Lesenswert?

Zur Ergänzung: Ich weis nicht wann ich Daten erhalte, das heist ich muss 
immer Empfangsbereit sein. Eine Art Interrupt wäre sonst auch brauchbar, 
allerdings kenne ich so etwas nur von Mikrocontrollern.

von Sven B. (scummos)


Lesenswert?

Auf welche Art empfängst du die Daten denn? TCP?

Sowas ähnliches wie ein Interrupt ist in Qt ein Signal. Das benutzt man 
normalerweise wenn man asynchrone Sachen hat, und dazu braucht man in 
vielen Fällen keine Threads.

: Bearbeitet durch User
von python (Gast)


Lesenswert?

Über eine serielle Schnittstelle. Zurzeit verwende ich ein spezielles 
Python modul für die Kommunikation.

von Sven B. (scummos)


Lesenswert?

Ok -- am besten, du postest mal den Code.

Du kannst erstmal sowas versuchen wie (Pseudocode)
1
def check_new_data():
2
  if bus.data_available():
3
     data = bus.read_data()
4
     # ... Daten verarbeiten
5
6
t = QTimer()
7
t.setTimeout(5ms)
8
t.timeout.connect(check_new_data)
9
t.start()

Mit sowas kuckst du einfach alle 5ms ob neue Daten auf dem Bus sind und 
verarbeitest die synchron wenn ja. Wenn das für deinen Zweck reicht, 
kannst du dir das Thread-Gedöhns sparen.

von python (Gast)


Lesenswert?

Da ich maximal mit 1kHz abtaste, könnte das eventuell funktionieren. Ich 
werde das mal ausprobieren, danke.

von Sven B. (scummos)


Lesenswert?

Es gibt sowieso einen Buffer. Solange da nicht megabyteweise Zeug drin 
steht zwischen zwei Reads, kannst du den Timer auch deutlich langsamer 
als die Samplerate laufen lassen.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.