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

1

26.11.2012, 22:51

Threading mit smfl, Argument Problem

Habe ein riesen Problem. :wacko:

Habe eine derartige Klasse:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
class Task
{
 public :
     void run(int i)
     {
         std::cout << "run ";
         std::cout << i;
     }
 };



die wird hetzt wie folgt in einem Thread gestartet. Ich nutze smfl und c++.

C-/C++-Quelltext

1
2
3
Task task;
sf::Thread thread(&Task::run, &task);
thread.launch(); // 


Aber wo soll ich bitte das Argument übergeben. Ich habe alles mögliche ausprobiert. Ist das etwa unmöglich? X(

LG
Bilder zu meinem Projekt: ParSim

NachoMan

Community-Fossil

Beiträge: 3 885

Wohnort: Berlin

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

  • Private Nachricht senden

2

26.11.2012, 23:01

Die Bibliothek heißt SFML. Bitte ändern!

Du kannst Task doch alles mögliche im Konstruktor übergeben. Wo liegt das Problem?
"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?

eXpl0it3r

Treue Seele

Beiträge: 386

Wohnort: Schweiz

Beruf: Professional Software Engineer

  • Private Nachricht senden

3

26.11.2012, 23:03

Aber wo soll ich bitte das Argument übergeben. Ich habe alles mögliche ausprobiert. Ist das etwa unmöglich?
RTFM! :D
SFML (nicht smfl!) hat eine der besten Dokumentation welche ich je gesehen habe, also nutze sie doch auch: sf::Thread
Was dann auch schon offensichtlich macht, dass es so direkt nicht geht (sf::Thread::Thread(void(C::*)() function, C * object)). Aber es gibt ja noch std::bind, falls das von deinem Compiler unterstützt wird.

C-/C++-Quelltext

1
2
3
Task task;
sf::Thread thread(std::bind(&Task::run, &task, 10));
thread.launch();
Blog: https://dev.my-gate.net/
—————————————————————————
SFML: https://www.sfml-dev.org/
Thor: http://www.bromeon.ch/libraries/thor/
SFGUI: https://github.com/TankOs/SFGUI/

4

26.11.2012, 23:12

:thumbsup:

Habe ohne scheiß seit bestimmt 3 Stunden probiert.
Jetzt hat es geklappt. Vielen Dank!!!

LG
Bilder zu meinem Projekt: ParSim

NachoMan

Community-Fossil

Beiträge: 3 885

Wohnort: Berlin

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

  • Private Nachricht senden

5

26.11.2012, 23:13

Worin liegt darin jetzt der Vorteil?
"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?

6

26.11.2012, 23:23

Ich kann der Funktion in dem Thread eine Argument übergeben. Wenn das nicht ginge wüsste die Funktion ja nichts so richtig zu tun.

Ich habe jetzt noch eine Frage:

C-/C++-Quelltext

1
2
3
4
5
for (int i = 0; i < allocator.particleThreadNumber; i++)
{
    sf::Thread thread(std::bind(&Accessor::physicalSimulation, &accessor, allocator.particleLocation[i]));
    thread.launch();
}


So sieht es in meinem Programm aus und funktioniert nicht^^.
Es wird immer wieder der selbe Thread gestartet. Ergebnis: Chaos.

Ich würde gerne einen Array von Threads nutzen in etwa so:

C-/C++-Quelltext

1
sf::Thread thread[16];

es kommt der Fehler:

Quellcode

1
sf::Thread::Thread': Kein geeigneter Standardkonstruktor verfügbar

Tja, ich weiß was das bedeutet. Und einen geeigneten Konstriktor bekomme ich nicht hin.
Sollte ich statt SMFL eine andere lib zu Threading nutzen, oder gibt es einen weg?

LG
Bilder zu meinem Projekt: ParSim

Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von »Horus« (27.11.2012, 00:05)


eXpl0it3r

Treue Seele

Beiträge: 386

Wohnort: Schweiz

Beruf: Professional Software Engineer

  • Private Nachricht senden

7

27.11.2012, 01:10

Worin liegt darin jetzt der Vorteil?
Über den Konstruktor könntest du nur einmal einen Wert übergeben, während man mit std::bind immer einen anderen Wert übergeben kann.

So sieht es in meinem Programm aus und funktioniert nicht^^.
Es wird immer wieder der selbe Thread gestartet. Ergebnis: Chaos.
Deine Beobachtung stimmt nicht ganz. Was du jetzt erhältst ist eine sequentiellen Aufruf der Funktion, weil am Ende der Schleife wird das Thread Objekt zerstört und intern wird thread.wait() aufgerufen, somit wird nach jeder Iteration gewartet bis der Thread beendet hat. Als läuft da gar nichts parallel.


Ich würde gerne einen Array von Threads nutzen in etwa so:
sf::Thread thread[16];
es kommt der Fehler:
sf::Thread::Thread': Kein geeigneter Standardkonstruktor verfügbar
Tja, ich weiß was das bedeutet. Und einen geeigneten Konstriktor bekomme ich nicht hin.
Sollte ich statt SMFL eine andere lib zu Threading nutzen, oder gibt es einen weg?
Ich empfehl dir kein Array zu verwenden, denn wie du ebenfalls in der Dokumentation nach lesen kannst, gibt es keinen Standardkonstruktor. Wenn du nicht weisst was das ist, oder was die Fehlermeldung bedeutet, solltest du noch einmal dein C++ Buch/Tutorial/etc zur Hand nehmen und nach schauen, was denn das genau ist...
Jedenfalls muss man, da es keinen Standardkonstruktor hat, die Objekte dynamisch generieren und da empfehle ich die Verwendung von std::vector und std::unique_ptr (soweit dein Compiler das unterstützt).

Das Ganze sieht dann so aus:

C-/C++-Quelltext

1
2
3
4
5
6
7
std::vector<std::unique_ptr<sf::Thread>> threads;

for (unsigned int i = 0; i < allocator.particleThreadNumber; ++i)
{
    threads.push_back(std::unique_ptr<sf::Thread>(new sf::Thread(std::bind(&Accessor::physicalSimulation, &accessor, allocator.particleLocation[i]))));
    threads.back()->launch();
}

Wenn du keine Ahnung hast was hier nun alles passiert, dann solltest du auch die Themen 'std::vector', 'std::unique_ptr', 'std::bind' erforschen gehen. ;)
Blog: https://dev.my-gate.net/
—————————————————————————
SFML: https://www.sfml-dev.org/
Thor: http://www.bromeon.ch/libraries/thor/
SFGUI: https://github.com/TankOs/SFGUI/

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

8

27.11.2012, 07:49

Ich würde empfehlen, einfach std::thread zu benutzen, die kannst du problemlos auch in einen std::vector, ja sogar in ein normales Array packen und da gibts auch keine Schwierigkeiten mit den Argumenten... ;)

Dieser Beitrag wurde bereits 3 mal editiert, zuletzt von »dot« (27.11.2012, 07:58)


9

27.11.2012, 08:30

Zitat

Ich würde empfehlen, einfach std::thread zu benutzen

Anscheinend wird das von meinem Microsoft Visual C++ 2010 Express nicht unterstützt. ;(
Zumindest kann ich die #include <thread> nicht finden. Vielleicht probier ich boost thread nochmal.


Zitat

Wenn du keine Ahnung hast was hier nun alles passiert, dann solltest du auch die Themen 'std::vector', 'std::unique_ptr', 'std::bind' erforschen gehen.

Ok alles klar. Werde ich machen. Danke für deine mühe, so weiß ich was ich suchen muss. :D

LG
Bilder zu meinem Projekt: ParSim

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

10

27.11.2012, 08:32

Hol dir Visual Studio Express 2012 for Windows Desktop, das unterstützt std::thread und noch viel mehr... ;)

Werbeanzeige