Simple C# Klasse (Unity); Konsolenausgaben verstehen

Cinematic

Lt. Commander
Registriert
Dez. 2010
Beiträge
1.296
Das Video ist mit der passenden Timestamp verlinkt, hier scrollt er einmal durch die ganze Klasse so dass alles zu sehen ist:


Und bei dieser Timestamp sieht man dann wie er das Programm ausführt ( 1:02:19 ):


In dem Tutorial geht's zwar um Threading, aber bei dieser Timestamp ist die Klasse erstmal noch ohne Threading. Er möchte halt hier erstmal den Nachteil aufzeigen, wenn man das Programm ohne Threading ausführt.
Die Funktion StartThreadedFunction() ist hier schon implementiert, wird aber noch nirgends aufgerufen.

Wer mit Unity nicht vertraut ist: die Start() Funktion wird einmalig zu Beginn vor dem ersten Frame aufgerufen. Die Update() Funktion wird nach jedem Frame einmal aufgerufen.

Ich hätte erwartet, dass man sofort "Start() started" sieht, dann 2 sek lang gar nichts passiert, da der einzig existierend Thread, also der Mainthread, wegen Thread.sleep(2000) pausiert.
Dann, sobald die 2000ms um sind, wird aFunction zur Queue hinzugefügt und mit der "Start() done" Konsolenausgabe fortgefahren, und quasi direkt danach kommt dann auch die Ausgabe "The results of the child thread [...]", was durch die Update() Funktion kommt, welche ja die Queue abarbeitet.

Warum passiert das aber so nicht?
 
Ich kenne mich zwar mit Unity nicht aus aber für mich siehts wie erwartet aus.

Der Mainthread startet den Async Thread und wartet nicht auf das Ergebnis.
Das ist ja auch das Ziel, dass der Mainthread nicht blockiert wird...
 
Danke für die Antwort, aber du hast meinen Post nicht ganz gelesen. Es gibt nur den einen Mainthread bei der Timestamp, die ich verlinkt habe. Falls ich mich irre, verrate mir bitte in welcher Zeile der Async Thread gestartet wird und in welcher Sekunde im Video ich das sehen kann.
 
Nur so als Hinweis am Anfang, Unity 5.5 ist schon uralt und viele Sachen wurden längst überarbeitet und verbessert.
Nun zur Frage, welche durchaus berechtigt ist. Das Problem ist, das die Unity Konsole (wobei das auch auf viele andere Konsolen) nicht so schnell im reagieren sind. Sprich, es bekommt einen string als input, dieser wird in eine anzeigefähige version umgewandelt, in dem Fall wird z.B. der Stacktrace hinzugefügt und dann einer Warteschlange hinzugefügt. Diese wird natürlich kontinuirlich gelehrt, da es ja schließlich auch über den Mainthread geht. Oder anders gesagt, du pausierst den Mainthread schneller als die Konsole den Text ausgeben kann.
 
  • Gefällt mir
Reaktionen: Cinematic
Okay, vielen Dank für die Erklärung @xxhagixx !
Dann ist dieses Beispiel didaktisch sehr schlecht gewählt, insbesondere weil der Videoersteller nicht genau erklärt warum die Konsolenausgaben genau so erfolgen wie man es im Video sieht.
 
Das könnte an der Log-Klasse liegen und wie die implementiert ist. Da wird wohl was in einen Buffer geschrieben und in einem eigenen Thread ausgegeben bzw. abhängig vom Main-Thread.

Eventuell gibt die Antwort in Thread Saftey and Debugging noch mehr Einblicke.
 
  • Gefällt mir
Reaktionen: Cinematic
Darum mache ich in C++ immer cerr statt cout und endl statt \n
Evtl gibts sowas auch in C# bzw. Unity?
 
Zurück
Oben