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
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; } }; |
C-/C++-Quelltext |
|
1 2 3 |
Task task; sf::Thread thread(&Task::run, &task); thread.launch(); // |
Community-Fossil
RTFM!Aber wo soll ich bitte das Argument übergeben. Ich habe alles mögliche ausprobiert. Ist das etwa unmöglich?
C-/C++-Quelltext |
|
1 2 3 |
Task task; sf::Thread thread(std::bind(&Task::run, &task, 10)); thread.launch(); |
Community-Fossil
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(); } |
C-/C++-Quelltext |
|
1 |
sf::Thread thread[16]; |
Quellcode |
|
1 |
sf::Thread::Thread': Kein geeigneter Standardkonstruktor verfügbar |
Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von »Horus« (27.11.2012, 00:05)
Über den Konstruktor könntest du nur einmal einen Wert übergeben, während man mit std::bind immer einen anderen Wert übergeben kann.Worin liegt darin jetzt der Vorteil?
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.So sieht es in meinem Programm aus und funktioniert nicht.
Es wird immer wieder der selbe Thread gestartet. Ergebnis: Chaos.
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...
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?
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(); } |
Dieser Beitrag wurde bereits 3 mal editiert, zuletzt von »dot« (27.11.2012, 07:58)
Zitat
Ich würde empfehlen, einfach std::thread zu benutzen
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.
Werbeanzeige