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

NachoMan

Community-Fossil

Beiträge: 3 885

Wohnort: Berlin

Beruf: (Nachhilfe)Lehrer (Mathematik, C++, Java, C#)

  • Private Nachricht senden

11

27.11.2012, 10:30

Deine Fragen(und dein Code) sind ein klares Zeichen dafür, dass du garkeine Ahnung hast was du dort tust.

Wofür brauchst du denn die Threads? Wofür brauchst du gerade 16 Stück?
Hast du schonmal was von race conditions und deadlocks gehört?

Ich benutze selbst sf::Thread und empfinde es als sehr angenehm und einfach.
"Der erste Trunk aus dem Becher der Erkenntnis macht einem zum Atheist, doch auf dem Grund des Bechers wartet Gott." - Werner Heisenberg
Biete Privatunterricht in Berlin und Online.
Kommt jemand mit Nach oMan?

12

27.11.2012, 13:35

Ich habe Vc express 2012 geholt. Habe schon erste erfolge. Aber auch neue Probleme.

in der mainclass.h deklarier ich:

C-/C++-Quelltext

1
2
sf::CircleShape circle;
sf::RectangleShape rectangle;


in der mainclass.cpp der Konstruktor:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
mainClass::mainClass(void)
{


    sf::CircleShape circle;

   ///usw...//
}



Bekomme beim Beenden den Fehler:

Quellcode

1
Run-Time Check Failure #2 - Stack around the variable 'circle' was corrupted.



Aber noch schlimmer: wenn ich mit dem circle zeichnen will , in meiner mainclass::draw funktion so:

C-/C++-Quelltext

1
2
3
circle.setRadius(3.0f);
circle.setPosition(mousePos.x,mousePos.y);
window.draw(circle);


dann:

Quellcode

1
Unhandled exception at at 0x75DAB727 in Game.exe: Microsoft C++ exception: std::length_error at memory location 0x0033C17C.

Unbehandelte Ausnahme bei 0x5B827783 (sfml-graphics-d-2.dll) in Game.exe: 0xC0000005: Zugriffsverletzung beim Schreiben an Position 0x00121000
Genau so habe ich es mit dem alten Visual c++ 2010 express doch auch gemacht.



Warum ich so viele Threads brauche?
Arbeite daran die Partikelengine von hier Quadtree und Fragen dazu
in c++ zu implementieren. SFML möchte ich für die Grafik nutzen.
Warscheinlich brauche ich viel mehr als 16 Threads für volle Leistung. :D

Bei der VS C++ 2010 hat SMFL gleich funktioniert. Ich hatte schon das GUI einsatzbereit und habe Partikel gezeichnet. Bei VS C++ 2012 will SMFL nicht so ein mist. :dash:
Wenn ich allerdings Zeichne, ohne Klassen zu nutzen dann geht es. Es geht nur eben nicht wenn ich klassen nehme. :thumbdown:
Bilder zu meinem Projekt: ParSim

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

13

27.11.2012, 13:45

Der Debugger weißt dich da oben hin, dass du irgendwo am Stack über den Speicher eines Objektes rausschreibst.
Und nein, du wirst weniger als 16 Threads brauchen, oder hast du eine CPU mit 16 Cores?

Nox

Supermoderator

Beiträge: 5 272

Beruf: Student

  • Private Nachricht senden

14

27.11.2012, 13:51

Ähm moment Mal. Du willst mit n Threads zeichnen? Ist dein Zeichenaufruf denn überhaupt dafür geeignet? Weil was bringt es wenn du 16 Malern den auftrag gibst doch bitte allesamt auf die gleiche 15cm x15cm Leinwand zu machen. Dass das nichts gibt sollte ja einleuchtend sein, weil entweder versuchen die alle gleichzeitig draufzupinseln oder jeder kommt der reine nach dran womit du genauso gut auch nur ein Maler dransetzen kannst.
PRO Lernkurs "Wie benutze ich eine Doku richtig"!
CONTRA lasst mal die anderen machen!
networklibbenc - Netzwerklibs im Vergleich | syncsys - Netzwerk lib (MMO-ready) | Schleichfahrt Remake | Firegalaxy | Sammelsurium rund um FPGA&Co.

15

27.11.2012, 13:53

Achja^^

https://www.dropbox.com/sh/zb3t32f56d251bw/9JHIaCYML9?m

Zitat

Der Debugger weißt dich da oben hin, dass du irgendwo am Stack über den Speicher eines Objektes rausschreibst.

Ja aber ich deklariere ja nur einen Shape
sf::circcle shape;
Schon wenn ich da shape.set irgendwas mache ist es vorbei.


Zitat

Und nein, du wirst weniger als 16 Threads brauchen, oder hast du eine CPU mit 16 Cores?

Ja :vain: Zumindest mein Lappi hat soviele.
Außerdem haben meine Tests mit der engine Version in c# ergeben dass ich viele (100+) Threads nehmen muss für optimale Leistung.
Ob das übertragbar ist bleibt zu testen.
Der Hintergrund war, dass nur so die Threads etwa gleichzeitig fertig sind, was extrem wichtig ist.

Die Daten lassen sich perfekt auf die Threads aufteilen!
Ich habe einen 1D Array von variablen. Threads 1 bearbeitet Variable 1-10 Thread 2 bearbeitet 11-20 usw... Es gibt dabei keine in die Quere kommen denke ich. ?(

LG
Bilder zu meinem Projekt: ParSim

Fred

Supermoderator

Beiträge: 2 121

Beruf: Softwareentwickler

  • Private Nachricht senden

16

27.11.2012, 14:08

Außerdem haben meine Tests mit der engine Version in c# ergeben dass ich viele (100+) Threads nehmen muss für optimale Leistung.
Ob das übertragbar ist bleibt zu testen.
Der Hintergrund war, dass nur so die Threads etwa gleichzeitig fertig sind, was extrem wichtig ist.

Das ist glaube ich keine vernünftige Lösung. Multi-Threading ist wirllich nicht einfach. Wenn du willst, dass deine Threads gleichzeitig fertig sind, dann musst du sie eben entsprechend synchronisieren, so dass alle aufeinander warten. Alles andere wird dir nur Probleme machen und funktioniert vielleicht zufällig, auf deinem Rechner, aber eben nicht zwangsläufig auf jedem anderen System.
Wenn du effizient mehrere Threads verwenden willst, musst du wirklich viel beachten und auch wissen; in den meisten Fällen ist Rumprobieren da nämlich die falsche Methode.

NachoMan

Community-Fossil

Beiträge: 3 885

Wohnort: Berlin

Beruf: (Nachhilfe)Lehrer (Mathematik, C++, Java, C#)

  • Private Nachricht senden

17

27.11.2012, 14:42

Unbehandelte Ausnahme bei 0x5B827783 (sfml-graphics-d-2.dll) in Game.exe: 0xC0000005: Zugriffsverletzung beim Schreiben an Position 0x00121000
Genau so habe ich es mit dem alten Visual c++ 2010 express doch auch gemacht.

Er hat von VS2010 auf VS2012 gewechselt ohne die SFML neu zu kompilieren. Habe ihm jetzt klar gemacht, dass er erstmal mit dem Multithreading aufhört und einfache Spiele entwickelt. :vain:
"Der erste Trunk aus dem Becher der Erkenntnis macht einem zum Atheist, doch auf dem Grund des Bechers wartet Gott." - Werner Heisenberg
Biete Privatunterricht in Berlin und Online.
Kommt jemand mit Nach oMan?

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

18

27.11.2012, 14:50

Zitat

Und nein, du wirst weniger als 16 Threads brauchen, oder hast du eine CPU mit 16 Cores?

Ja :vain: Zumindest mein Lappi hat soviele.

Was für eine CPU ist denn das bitte? Mir ist aktuell keine Laptop oder Desktop CPU mit 16 Cores bekannt. Sowas gibt's gerade mal im Serverbereich...

Außerdem haben meine Tests mit der engine Version in c# ergeben dass ich viele (100+) Threads nehmen muss für optimale Leistung.

Soweit ich mich erinnern kann, hast du festgestellt, dass du 100+ Workpackages brauchtest und nicht 100+ Threads.

Wenn ich das richtig sehe, erzeugst du im Moment in jedem Frame neue Threads? Wenn du Performance willst, dann ist das in der Tat das Letzte was du tun willst. Was du willst ist, beim Programmstart für jeden Core einen Thread zu erzeugen und diese Threads dann über Work Queues zu füttern. Dafür ist aber ein solides Verständnis von paralleler Programmierung nötig. Wenn ich dann sehe, wie du per sf::sleep() auf deine threads "wartest", ist klar, dass es dir in dem Bereich noch massiv an Grundlagen mangelt.
In dem Fall würde dir schwerstens empfehlen, die PPL oder so zu nutzen, die all diese Dinge automatisch für dich macht.

NachoMan

Community-Fossil

Beiträge: 3 885

Wohnort: Berlin

Beruf: (Nachhilfe)Lehrer (Mathematik, C++, Java, C#)

  • Private Nachricht senden

19

27.11.2012, 14:52

Was für eine CPU ist denn das bitte? Mir ist aktuell keine Laptop oder Desktop CPU mit 16 Cores bekannt. Sowas gibt's gerade mal im Serverbereich...

Wahrscheinlich 8 Kerne mit Hyperthreading
"Der erste Trunk aus dem Becher der Erkenntnis macht einem zum Atheist, doch auf dem Grund des Bechers wartet Gott." - Werner Heisenberg
Biete Privatunterricht in Berlin und Online.
Kommt jemand mit Nach oMan?

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

20

27.11.2012, 14:52

Was für eine CPU ist denn das bitte? Mir ist aktuell keine Laptop oder Desktop CPU mit 16 Cores bekannt. Sowas gibt's gerade mal im Serverbereich...

Wahrscheinlich 8 Kerne mit Hyperthreading

Ich kenn im Desktop oder Laptop Segment auch keinen Octocore mit Hyperthreading... ;)

Werbeanzeige