Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

CeDoMain

Alter Hase

  • »CeDoMain« ist der Autor dieses Themas

Beiträge: 587

Wohnort: Ilmenau

Beruf: Student für Mechatronik

  • Private Nachricht senden

11

21.05.2016, 13:35

Push: Was los Leute? War mein Post zu lang? Was ist mit dem Designfehler - hat sich der bewahrheitet? Was mache ich mit dieser Fehlermeldung - habe das mit einem try-catch bisher besänftigt, aber soll man nicht eher das Problem als die Symptome bekämpfen?
Mit freundlichem Gruß
CeDo
Discord: #6996 | Skype: cedomain

Lass solche persönlichen Angriffe lieber bleiben, meine sind härter.

Schorsch

Supermoderator

Beiträge: 5 145

Wohnort: Wickede

Beruf: Softwareentwickler

  • Private Nachricht senden

12

21.05.2016, 14:21

Erst mal stimme ich Sacaldur zu:
Ich wüsste nicht, in wie weit da eine statische Liste aller Instanzen, die von der Klasse selbst geführt wird, relevant sein sollte.

Weiterhin können Änderungen an der GUI in WPF nur im GUI Thread selbst getätigt werden. Guck mal hier.
„Es ist doch so. Zwei und zwei macht irgendwas, und vier und vier macht irgendwas. Leider nicht dasselbe, dann wär's leicht.
Das ist aber auch schon höhere Mathematik.“

CeDoMain

Alter Hase

  • »CeDoMain« ist der Autor dieses Themas

Beiträge: 587

Wohnort: Ilmenau

Beruf: Student für Mechatronik

  • Private Nachricht senden

13

22.05.2016, 00:46

Erst mal stimme ich Sacaldur zu:

Zitat von »Sacaldur«
Ich wüsste nicht, in wie weit da eine statische Liste aller Instanzen, die von der Klasse selbst geführt wird, relevant sein sollte.
Dass mein Programm aber irgendwo eine Auflistung haben muss, wo alle möglichen Pins drin gespeichert sind, ist schon logisch oder? Wenn es die Matrix generiert, habe ich keinen großen Bock jedes Mal meinen riesigen Klassenbaum zu durchlaufen, nur um an die Blätter zu kommen, die die Pins sind. Das geht doch wesentlich schneller, wenn ich die Pins schon alle in Listen habe und dann nur noch eine Matrix daraus generieren muss!?

In der Annahme, dass der Absatz oben nachvollziehbar ist: Weil meine beiden Pin-Klassen generisch sind, müsste ich entweder die Pins gemischt in eine einzige Liste packen oder ich müsste für jeden Generischen Typ eine eigene Liste machen. Ersteres habe ich probiert und bin gescheitert, wie sich in einem anderen Thread rauslesen lässt... :D Nun bin ich dabei für jeden Generischen Typ ein eigenes Array zu verwalten. Ist sowieso wesentlich besser, weil ich die Matrix immer nur für einen Typ zeichnen lasse und deshalb mir Filtern&Suchen spare. :) Jetzt steht für mich nur noch die Frage im Raum, wo ich diese Generischen Arrays am besten anlege - meiner Meinung nach in den generischen Klassen selbst, aber da stoße ich ja auf Widerstand... :D

Weiterhin können Änderungen an der GUI in WPF nur im GUI Thread selbst getätigt werden.
Aber ich ändere doch garnicht die GUI, sondern rufe Clear() für die Collections auf!? Und der Destruktor, der das ganze verursacht - in welchem Thread wird der aufgerufen? Kann ich das mit Visual Studio 2015 rausfinden?
Mit freundlichem Gruß
CeDo
Discord: #6996 | Skype: cedomain

Lass solche persönlichen Angriffe lieber bleiben, meine sind härter.

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »CeDoMain« (22.05.2016, 00:59)


equinox

Frischling

Beiträge: 56

Beruf: Student

  • Private Nachricht senden

14

22.05.2016, 13:58

Wenn du eine Matrix nur selten erzeugst, und so verstehe ich das was du gezeigt hast, lohnt sich das Speichern in einer Liste nicht wirklich. Das wäre höchstens minimal effizienter, wenn überhaupt.

Schorsch

Supermoderator

Beiträge: 5 145

Wohnort: Wickede

Beruf: Softwareentwickler

  • Private Nachricht senden

15

22.05.2016, 15:18

Geht es nicht um Observable-Collections? Die sind vermutlich mit irgendeinem Binding an die Gui gekoppelt.
„Es ist doch so. Zwei und zwei macht irgendwas, und vier und vier macht irgendwas. Leider nicht dasselbe, dann wär's leicht.
Das ist aber auch schon höhere Mathematik.“

CeDoMain

Alter Hase

  • »CeDoMain« ist der Autor dieses Themas

Beiträge: 587

Wohnort: Ilmenau

Beruf: Student für Mechatronik

  • Private Nachricht senden

16

22.05.2016, 16:15

Wenn du eine Matrix nur selten erzeugst, und so verstehe ich das was du gezeigt hast, lohnt sich das Speichern in einer Liste nicht wirklich. Das wäre höchstens minimal effizienter, wenn überhaupt.
Die Matrix wird oft ein und ausgeblendet, weil man nicht immer die Verknüpfungen verändern möchte. Außerdem wird es am Ende ca. 20 verschiedene Generic-Parameter geben. Wenn die Matrix eingeblendet wird, müsste erstmal eine komplexe Baumhierarchie traversiert werden und dann noch nach Generic-Parametern gefiltert werden. Das klingt für mich wesentlich aufwendiger als einfach alle Instanzen in Listen der jeweiligen generischen Pin-Klassen zu speichern. Was sich vergleichsweise wenig ändert ist die Menge der Pins an sich. Das spricht meiner Meinung nach auch für eine sortierte Speicherung. Sind damit denn jetzt alle Zweifel an etwaigen Designfehlern geklärt? :D

Geht es nicht um Observable-Collections? Die sind vermutlich mit irgendeinem Binding an die Gui gekoppelt.
Ein direktes Binding gibt es nicht, die einzige verbindung ist hierin Zeile 18/19 zu finden. Wird dieses Event ausgelöst werden die 3 Listen in Zeile 7-9 aktualisiert, die dann tatsächlich mit einem Binding an die GUI gekoppelt sind. Aber so ein System findet sich doch öfters!? Das klappt ja auch wunderbar während der Laufzeit - nur eben nicht wenn das Update durch einen Destruktoraufruf am Ende des Programms ausgelöst wird. :(
Mit freundlichem Gruß
CeDo
Discord: #6996 | Skype: cedomain

Lass solche persönlichen Angriffe lieber bleiben, meine sind härter.

Schorsch

Supermoderator

Beiträge: 5 145

Wohnort: Wickede

Beruf: Softwareentwickler

  • Private Nachricht senden

17

22.05.2016, 17:44

Das klappt ja auch wunderbar während der Laufzeit - nur eben nicht wenn das Update durch einen Destruktoraufruf am Ende des Programms ausgelöst wird.

In C# gibt es übrigens keine Destruktoren. Du scheinst dieses Update wohl eben nicht im Hauptthread zu machen. Wie gesagt, arbeitest du da mit mehreren Threads benötigst du den Dispatcher.
„Es ist doch so. Zwei und zwei macht irgendwas, und vier und vier macht irgendwas. Leider nicht dasselbe, dann wär's leicht.
Das ist aber auch schon höhere Mathematik.“

CeDoMain

Alter Hase

  • »CeDoMain« ist der Autor dieses Themas

Beiträge: 587

Wohnort: Ilmenau

Beruf: Student für Mechatronik

  • Private Nachricht senden

18

22.05.2016, 18:11

In C# gibt es übrigens keine Destruktoren.
Und was ist dann das? Außerdem verwende ich doch Destruktoren in meinem Code!?

Ich habe an keiner Stelle in meinem Programm einen neuen Thread explizit erstellt. Darum kann ich nicht sagen, von welchem Thread die Clear-Methode der ObservableCollection aufgerufen wird. Im Debugger wird mir beim Fehlerwurf der "GC-Finalizer-Thread" als aktueller Thread genannt. Ist der nicht berechtigt die ObservableCollections zu leeren?

Weil C# ja den netten GC besitzt ist der Aufruf(zeitpunkt) vom Destruktor sowieso ungewiss. Wenn ich ein Objekt aus dem internen Baum lösche, muss das also nicht heißen, dass sofort auch die enthaltenen Pins gelöscht werden. Wenn ich so drüber nachdenke gefällt mir das nicht - ich will ja keine Pins in meiner Matrix haben von Elementen, die es nicht mehr gibt. Kann es nicht sogar sein, dass der Destruktor eines Pins nie aufgerufen wird (außer am Programmende), weil jeder Pin in meiner Instanzenliste enthalten ist und daraus nur durch den Destruktor gelöscht wird!?

Um das zu lösen habe ich mir überlegt eine Unregister-Methode zu programmieren, die das Entfernen aus der Instanzliste übernimmt. Diese Methode wird dann beim Entfernen eines Elements aus dem Baum für jeden Pin in diesem Element aufgerufen. Sowas wollte ich eigentlich vermeiden, indem ich das Unregistrieren automatisch durch einen Destruktor geschehen lasse, aber das geht ja wegen dem GC wohl nicht... :D Was haltet ihr von dieser Vorgehensweise?
Mit freundlichem Gruß
CeDo
Discord: #6996 | Skype: cedomain

Lass solche persönlichen Angriffe lieber bleiben, meine sind härter.

Sylence

Community-Fossil

Beiträge: 1 663

Beruf: Softwareentwickler

  • Private Nachricht senden

19

23.05.2016, 07:57

In C# gibt es übrigens keine Destruktoren.
Und was ist dann das?
Also eigentlich heißen die Dinger ja Finalizer. Interessant, dass sie in der Doku als Destruktoren drin stehen :pillepalle:
Die Dinger sind auf jeden Fall nur dafür da, um unmanaged resources freigeben zu können.

Im Debugger wird mir beim Fehlerwurf der "GC-Finalizer-Thread" als aktueller Thread genannt. Ist der nicht berechtigt die ObservableCollections zu leeren?

Nein ist er nicht. Also bzw das leeren an sich ist nicht das Problem. Das Problem ist, dass da eben noch ein GUI-Element dranhängt, welches sich dann aktualisieren will. Und das darf eben nur aus dem GUI-Thread geschehen.

Kann es nicht sogar sein, dass der Destruktor eines Pins nie aufgerufen wird (außer am Programmende), weil jeder Pin in meiner Instanzenliste enthalten ist und daraus nur durch den Destruktor gelöscht wird!?

Jap. Solange es noch eine Referenz auf die Instanz gibt, wird die nicht weggeräumt.

Sacaldur

Community-Fossil

Beiträge: 2 301

Wohnort: Berlin

Beruf: FIAE

  • Private Nachricht senden

20

23.05.2016, 10:07

Zum Designfehler (statische Liste aller Instanzen in der jeweiligen Klasse):
Du hast zwar erklärt, warum du Listen für die Pins benötigst, aber ich sehe noch immer keinen Grund, diese Listen als statische Member in den Klassen anzulegen. Du könntest diese ebenso in einer Model-Klasse hinterlegen.
Also: ich sehe noch immer keinen Grund für statische Listen innerhalb der Klassen.
Spieleentwickler in Berlin? (Thema in diesem Forum)
---
Es ist ja keine Schande etwas falsch zu machen, als Programmierer tu ich das täglich, [...].

Werbeanzeige