Ein Thread ist ein Stück Programmcode (egal wie complex), der auf der CPU vom Betriebssystem extra ausgeführt wird (einfach gesagt). Initial ist deine Anwendung ein einzelner Thread. In diesem läuft alles nacheinander ab. Der Ablauf ist deterministisch.
Sobald du mehr als einen Thread hast, laufen diese voneinander unabhängig. Du weißt nicht mehr, welcher Befehl zuerst aufgeführt wird, wenn du verschiedene Threads miteinander vergleichst. Jeder Thread für sich ist deterministisch, als eine gesamthafte Betrachtung weißt du aber nicht was gerade auf der CPU an der Reihe ist.
Weil du das nicht weißt, dürfen Threads sich nicht in ihren Aufgaben überschneiden z.B. beide auf die Oberfläche zeichnen. Wenn sie das tun müsstest du sie "synchronisieren" d.h. aufpassen daß ihre Daten und Zustände "gleich" sind. Da das sehr schwierig ist, sollte man darauf nach Möglichkeit verzichten.
Jetzt kommen wir zu deinem Beispiel:
Du erzeugst zwei Threads. Du weißt nicht wer wie viel Rechenleistung erhält und damit herrscht ein gewisses Chaos in der Ausführung. Deswegen sollten diese voneinander unabhängig sein. T1 isses egal ob der User Daten tippt oder nicht, T2 isses egal ob es Daten zum zeichnen gibt ABER wenn es was gibt handeln sie entsprechend.
Die einzige Verbindung zwischen T1 und T2 ist die statische ConcurrentQueue, die du erzeugen musst, worüber T1 dem T2 die Daten zum zeichnen liefert.
Sobald du mehr als einen Thread hast, laufen diese voneinander unabhängig. Du weißt nicht mehr, welcher Befehl zuerst aufgeführt wird, wenn du verschiedene Threads miteinander vergleichst. Jeder Thread für sich ist deterministisch, als eine gesamthafte Betrachtung weißt du aber nicht was gerade auf der CPU an der Reihe ist.
Weil du das nicht weißt, dürfen Threads sich nicht in ihren Aufgaben überschneiden z.B. beide auf die Oberfläche zeichnen. Wenn sie das tun müsstest du sie "synchronisieren" d.h. aufpassen daß ihre Daten und Zustände "gleich" sind. Da das sehr schwierig ist, sollte man darauf nach Möglichkeit verzichten.
Jetzt kommen wir zu deinem Beispiel:
Du erzeugst zwei Threads. Du weißt nicht wer wie viel Rechenleistung erhält und damit herrscht ein gewisses Chaos in der Ausführung. Deswegen sollten diese voneinander unabhängig sein. T1 isses egal ob der User Daten tippt oder nicht, T2 isses egal ob es Daten zum zeichnen gibt ABER wenn es was gibt handeln sie entsprechend.
Die einzige Verbindung zwischen T1 und T2 ist die statische ConcurrentQueue, die du erzeugen musst, worüber T1 dem T2 die Daten zum zeichnen liefert.