C++ problem z działaniem wątków

Dzień dobry.
W poprzednim wątku utworzonym przeze mnie wysłałem klasę, mającą na celu poruszaniem pedami w grze. Myślałęm, że funkcja bez argumentów, w któ


ej środku wywołam funkcję z pięcioma argumentami również zostanie wykonana w wątku, w którym została wywołana funkcja bez argumentów, jednak tak się nie stało. Moze mi ktoś z was w takim razie powiedzieć, w jaki sposób mam zarejestrować w klasie wątek dla funkcjii przyjmującej 5 parametrów, których nie określam ja, tylko są losowane w trakcie działania programów?

Pokaż kod co masz bo ciężko odgadnąć co chcesz zrobić. Jeśli parametry mają być generowane to można to robić metodą, tylko zwróć uwagę, żeby nie było używanych zmiennych globalnych a jeśli tak, to żeby były dobrze wykryte sekcje krytyczne. Ja kiedyś robiłem w ten sposób, że wątek graczy komputerowych każdy miał swoją kolejke komunikatów. Wątek główny dodawał komunikaty do kolejki, a wątki graczy ściągali sobie każdy ze swojej kolejki. Sekcjami krytycznymi były momenty dodawania, ściągania komunikatu na kolejkę.

to jest single. Funkcja goToCoords przyjmuje 5 parametrów. index pedu, koordynaty, do których ma isć oraz typ pedu, człowiek, albo jakieś zwierzęta czy ptaki. Potrzebuję to przenieść do osobnego wątku, bo do odtwarzania dźwięków kroków itd. używam timerów, a jak nie jest w wątku to mi zwiesza całą grę.

No to zrób globalną kolejkę. Do niej dodawaj strukturę z tymi 5 wartościami. W wątku wykonawczym ściągaj z tej globalnej kolekcji kolejne obiekty i jak będzie coś nowego to wykonuj metodę. Oczywiście wkładanie i zdejmowanie powinno być sekcją krytyczną. Nie wiem gdzie tu jeszcze jakaś niejasność jest ?

Ale z tego co się orientuję sfml drugi parametr wywołujący sf::Thread w klasie uznaje za obiekt klasy, czyli w tym momencie rejestrując wątek w konstruktorze jest to this, więc i tak niczego innego już nie przekażę.

Nie tędy droga, wątek powinien w sposób ciągły pracować i pobierać dane z kolejki o danym id, i to w tym wątku synchronicznie wywoływać metodę z 5 parametrami … Pokaż ten kod metody do wykonania i jak powołujesz wątek to może wskażę ci miejsce gdzie co i jak.

Wątek inicjuję tak, jak ponoć powinien być inicjowany w klasie.
Uruchamiam go za pomocą ped.launchThread(); w głównym silniku.
funkcja update się wykonuje, ale funkcja goToCoords wykonuje się poza wątkiem, w którym funkcja update. Nie wiem, jak inaczej rozwiązać to tak, jak mówiliście.

ped.h:
#ifndef FPED
#define FPED
#include
#include
#include
#include <errno.h>
#include
#ifndef _WIN32
#include <unistd.h>
#include <semaphore.h>
#include <speech-dispatcher/libspeechd.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <dirent.h>
#include <wait.h>
#include <signal.h>
#endif
#include
#include <SFML/Graphics.hpp>
#include <SFML/System.hpp>
#include <audio.h>
#include <system.h>
#include <logger.h>
#include <helpers.h>
class Ped
{
public:
enum PED_TYPE { CAT, COW, DOG, HUMAN };
Ped();
~Ped(void);
void installAudio(Audio &a);
void launchThread();
void terminateThread();
void createRandomPedsAt3DCoords(int c, float x, float y, float z);
void del(int index);
void setCoords(int index, float &x, float &y, float &z);
int getSize();
void setHealth(int index, int h);
int getHealth(int index);
void update(void);
void goToCoords(int pedindex, float x, float y, float z, PED_TYPE t);
PED_TYPE getType(int index);
Vector3D getCoords(int index);
private:
struct Pedd
{
sf::Vector2f speed;
bool big;
float x;
float y;
float z;
PED_TYPE t;
int health;
sf::Clock clk[2];
sf::Time tim[2];
int jump;
int interval;
bool missionflag;
};
vector a_ped;
Audio *audio;
sf::Clock clock[1024];
sf::Time czas[1024];
sf::Thread thr;
sf::Mutex mu;
};
#endif

ped.cpp:
#include <ped.h>
Ped::Ped() : thr(&Ped::update, this)
{
logmsg(“Ped: spawn”);
createRandomPedsAt3DCoords(1000, 0, 0, 0);
}
Ped::~Ped(void)
{
logmsg(“Ped: destroy”);
for(int i = 0; i < getSize(); i++)
{
del(i);
}
}
void Ped::installAudio(Audio &a)
{
this->audio = &a;
}
void Ped::createRandomPedsAt3DCoords(int peds, float _x, float _y, float _z)
{
logmsg(“Ped: creating %i peds at %.1f %.1f %.1f”, peds, _x, _y, _z);
srand(time(NULL));
for (int i = 0; i < peds; i++)
{
Pedd pd;
pd.big = false;
pd.health = 100;
pd.jump = 1;
if (_x == 0 && _y == 0 && _z == 0)
{
if (rand() % 10 > 4) pd.big = true; else pd.big = false;
pd.x = rand() % 6000;
pd.y = rand() % 6000;
pd.z = 0;
}
else
{
pd.x = _x;
pd.y = _y;
pd.z = _z;
}
if(i <= 100)
{
pd.t = CAT;
pd.interval = 10;
}
else if(i > 100 && i <= 200)
{
pd.t = COW;
pd.interval = 20;
}
else if(i > 200 && i <= 300)
{
pd.t = DOG;
pd.interval = 10;
}
else if(i > 300 && i <= peds)
{
pd.t = HUMAN;
pd.interval = 22;
}
int radius = 40;
if (pd.big) radius = 1.5;
float vx, vy;
vx = (rand() % 2) + 1;
vy = (rand() % 2) + 1;
if (rand() % 2 == 0) vx
=-1;
if (rand() % 2 == 0) vy *= -1;
pd.speed = sf::Vector2f(vx / 1.5, vy / 1.5);
a_ped.push_back(pd);
}
logmsg(“Ped: done”);
}
void Ped::del(int in)
{
for (int i = in; i < a_ped.size() - 1; i++)
{
swap(a_ped[i], a_ped[i + 1]);
}
a_ped.resize(a_ped.size() - 1);
}
int Ped::getSize()
{
return a_ped.size();
}
Ped::PED_TYPE Ped::getType(int index)
{
return a_ped[index].t;
}
void Ped::setHealth(int index, int h)
{
a_ped[index].health = h;
}
int Ped::getHealth(int index)
{
return a_ped[index].health;
}
void Ped::setCoords(int ind, float &xx, float &yy, float &zz)
{
a_ped[ind].x = xx;
a_ped[ind].y = yy;
a_ped[ind].z = zz;
}
void Ped::update()
{

srand(time(NULL));
if(getSize() > 0)
{
for(int d = 0; d < getSize(); d++)
{
logmsg(“Updating PED %i”, d);
if ((a_ped[d].t == CAT))
{
czas[0] = clock[0].getElapsedTime();
int los1 = rand() % 60;
int los2 = rand() % 60;
if (czas[0].asSeconds() <= los1)
{
a_ped[d].tim[2] = a_ped[d].clk[2].getElapsedTime();
if (a_ped[d].tim[2].asSeconds() >= 5)
{
audio->play3DSound(audio->MEOF01, a_ped[d].x, a_ped[d].y, a_ped[d].z);
a_ped[d].clk[2].restart();
}
if (a_ped[d].x <= -2000)
{
int cx = rand() % 20;
goToCoords(d, a_ped[d].x + cx, a_ped[d].y, 0, CAT);
}
else if (a_ped[d].x >= 2000)
{
int cx = rand() % 20;
goToCoords(d, a_ped[d].x - cx, a_ped[d].y, 0, CAT);
}
if (a_ped[d].y <= -2000)
{
int cy = rand() % 20;
goToCoords(d, a_ped[d].x, a_ped[d].y + cy, 0, CAT);
}
else if (a_ped[d].y >= 2000)
{
int cy = rand() % 20;
goToCoords(d, a_ped[d].x, a_ped[d].y - cy, 0, CAT);
}
}
else if (czas[0].asSeconds() > los1 && czas[0].asSeconds() <= los2)
{
a_ped[d].tim[1] = a_ped[d].clk[1].getElapsedTime();
if (a_ped[d].tim[1].asSeconds() >= 5)
{
audio->play3DSound(audio->PURE01, a_ped[d].x, a_ped[d].y, a_ped[d].z);
audio->setSoundLoop(audio->PURE01, true);
a_ped[d].clk[1].restart();
}
if (a_ped[d].x <= -2000)
{
int cx = rand() % 20;
goToCoords(d, a_ped[d].x + cx, a_ped[d].y, 0, CAT);
}
else if (a_ped[d].x >= 2000)
{
int cx = rand() % 20;
goToCoords(d, a_ped[d].x - cx, a_ped[d].y, 0, CAT);
}
if (a_ped[d].y <= -2000)
{
int cy = rand() % 20;
goToCoords(d, a_ped[d].x, a_ped[d].y + cy, 0, CAT);
}
else if (a_ped[d].y >= 2000)
{
int cy = rand() % 20;
goToCoords(d, a_ped[d].x, a_ped[d].y - cy, 0, CAT);
}
clock[0].restart();
}
}
else if ((a_ped[d].t = COW))
{
czas[1] = clock[1].getElapsedTime();
int los1 = rand() % 60;
int los2 = rand() % 120;
if (czas[1].asSeconds() >= los1)
{
a_ped[d].tim[2] = a_ped[d].clk[2].getElapsedTime();
if (a_ped[d].tim[2].asSeconds() > 5)
{
int sound0 = rand() % 2;
if(sound0 == 0)
{
audio->play3DSound(audio->M01, a_ped[d].x, a_ped[d].y, a_ped[d].z);
}
else if(sound0 != 0)
{
audio->play3DSound(audio->M02, a_ped[d].x, a_ped[d].y, a_ped[d].z);
}
a_ped[d].clk[2].restart();
}
if (a_ped[d].x <= -3000)
{
int cx = rand() % 20;
goToCoords(d, a_ped[d].x + cx, a_ped[d].y, 0, COW);
}
else if (a_ped[d].x >= 3000)
{
int cx = rand() % 20;
goToCoords(d, a_ped[d].x - cx, a_ped[d].y, 0, COW);
}
if (a_ped[d].y <= -3000)
{
int cy = rand() % 20;
goToCoords(d, a_ped[d].x, a_ped[d].y + cy, 0, COW);
}
else if (a_ped[d].y >= 3000)
{
int cy = rand() % 20;
goToCoords(d, a_ped[d].x, a_ped[d].y - cy, 0, COW);
}
}
else if (czas[2].asSeconds() > los2)
{
a_ped[d].tim[1] = a_ped[d].clk[1].getElapsedTime();
if (a_ped[d].tim[1].asSeconds() > 5)
{
audio->play3DSound(audio->M03, a_ped[d].x, a_ped[d].y, a_ped[d].z);
a_ped[d].clk[1].restart();
}
clock[1].restart();
}
}
else if ((a_ped[d].t == DOG))
{
czas[2] = clock[2].getElapsedTime();
int los1 = rand() % 60;
int los2 = rand() % 60;
if (czas[2].asSeconds() <= los1)
{
a_ped[d].tim[2] = a_ped[d].clk[2].getElapsedTime();
if (a_ped[d].tim[2].asSeconds() >= 5)
{
int sound1 = rand() % 2;
if(sound1 == 0) audio->play3DSound(audio->DOG01, a_ped[d].x, a_ped[d].y, a_ped[d].z); else if(sound1 != 0) audio->play3DSound(audio->DOG02, a_ped[d].x, a_ped[d].y, a_ped[d].z);
a_ped[d].clk[2].restart();
}
if (a_ped[d].x <= -2000)
{
int cx = rand() % 20;
goToCoords(d, a_ped[d].x + cx, a_ped[d].y, 0, DOG);
}
else if (a_ped[d].x >= 2000)
{
int cx = rand() % 20;
goToCoords(d, a_ped[d].x - cx, a_ped[d].y, 0, DOG);
}
if (a_ped[d].y <= -2000)
{
int cy = rand() % 20;
goToCoords(d, a_ped[d].x, a_ped[d].y + cy, 0, DOG);
}
else if (a_ped[d].y >= 2000)
{
int cy = rand() % 20;
goToCoords(d, a_ped[d].x, a_ped[d].y - cy, 0, DOG);
}
}
else if (czas[2].asSeconds() > los1 && czas[2].asSeconds() <= los2)
{
a_ped[d].tim[1] = a_ped[d].clk[1].getElapsedTime();
if (a_ped[d].tim[1].asSeconds() >= 5)
{
audio->play3DSound(audio->DOG03, a_ped[d].x, a_ped[d].y, a_ped[d].z);
a_ped[d].clk[1].restart();
}
if (a_ped[d].x <= -2000)
{
int cx = rand() % 20;
goToCoords(d, a_ped[d].x + cx, a_ped[d].y, 0, DOG);
}
else if (a_ped[d].x >= 2000)
{
int cx = rand() % 20;
goToCoords(d, a_ped[d].x - cx, a_ped[d].y, 0, DOG);
}
if (a_ped[d].y <= -2000)
{
int cy = rand() % 20;
goToCoords(d, a_ped[d].x, a_ped[d].y + cy, 0, DOG);
}
else if (a_ped[d].y >= 2000)
{
int cy = rand() % 20;
goToCoords(d, a_ped[d].x, a_ped[d].y - cy, 0, DOG);
}
clock[2].restart();
}
}
if(a_ped[d].health == 0)
{
del(d);
}
if(a_ped[d].x > 11000)
{
a_ped[d].x = 11000;
}
else if(a_ped[d].y > 11000)
{
a_ped[d].y = 11000;
}

}

}

}
void Ped::goToCoords(int ind, float x, float y, float z, PED_TYPE t)
{
do{
a_ped[ind].tim[0] = a_ped[ind].clk[0].getElapsedTime();
if(a_ped[ind].tim[0].asMilliseconds() >= a_ped[ind].interval)
{
if(a_ped[ind].x < x)
{
a_ped[ind].x += 1;
}
else if(a_ped[ind].x > x)
{
a_ped[ind].x -= 1;
}
if(a_ped[ind].y < y)
{
a_ped[ind].y += 1;
}
else if(a_ped[ind].y > y)
{
a_ped[ind].y -= 1;
}
if(t == CAT || t == DOG)
{
audio->play3DSound(audio->STEP7, a_ped[ind].x, a_ped[ind].y, a_ped[ind].z);
}
else if(t == HUMAN)
{
audio->play3DSound(audio->STEP6, a_ped[ind].x, a_ped[ind].y, a_ped[ind].z);
}
else if(t == COW)
{
audio->play3DSound(audio->STEP8, a_ped[ind].x, a_ped[ind].y, a_ped[ind].z);
}
a_ped[ind].clk[0].restart();
}
} while(a_ped[ind].x != x || a_ped[ind].y != y || a_ped[ind].z != z);

}

void Ped::launchThread()
{
thr.launch();
}
void Ped::terminateThread()
{
thr.terminate();
}
Vector3D Ped::getCoords(int index)
{
return {a_ped[index].x, a_ped[index].y, a_ped[index].z};
}

Sformatuj to porządnie i wrzuć jako kod, bo nie da się tego czytać.

niewidomy jestem i nie wiem, o czym mówisz. Dla screen readera kod jest zawsze kodem.

Wybacz, ale to jawny brak szacunku do osoby, która chciała pomóc. Niestety musisz poradzić sobie sam, lub poprosić kogoś innego.

Brakiem szacunku jest to, żę stwierdziłem, że dla screen readera kod jest zawsze kodem? Jawną głupotą jest obrażać się o coś takiego. Cóż, normalne społeczeństwo musi chyba zrozumieć, że niewidomy też człowiek.

Normalne społeczeństwo nie ma obowiązku wiedzieć co to niby “screen reader”. Brakiem kultury za to jest zarzucanie głupoty co jest obraźliwe, w kontrze na zauważenie braku szacunku dla współrozmówcy. Wchodzisz w społeczeństwo więc powinieneś szanować je, a zmuszanie kogoś do czytania niesformatowanego kodu to brak szacunku dla jego czasu. Sądzę, że bycie uważanym na równi z innymi to też szanowanie jakiś standardów i nie uważanie się za pępek świata. Sam również nie jestem w pełni sprawny fizycznie, jednak nie lubię jak ktoś się zasłania i jeszcze wyzywa od głupich… Poczytaj o wcięciach i białych znakach. Nie dość, że jesteś zuchwały to jeszcze niedouczony - może nie w C++ ale w Pythonie jak nie zachowasz formatowania to kod się nie skompiluje bo białych znaków używa się tam do zaznaczenia struktury i zasięgu instrukcji. Swoją drogą, że brak znaczników cytatu na tym forum sprawił, że wszystkie include przez płotek spowodował sparsowanie tekstu i wyciął połowę w pień - może jakiś mod to poprawi.

Dobra - mam nadzieję, że przyjmiesz moje powyższe rady. Jeśli nie dajesz rady sam formatować kodu i nie wiedziałeś, że można posłużyć się narzędziem to użyj strony znajomka z konkurencyjnego forum :wink: http://format.krzaq.cc/ - tam wklejasz kod w C++, a po przyciśnięciu przycisku “Format!” skrypt zrobi wszystkie wcięcia, usystematyzuje nawiasy etc.

Jednak do meritum. Jeśli chodzi o twój problem - Ty powołujesz obiekt wątku i odpalasz w nim funkcje bez parametryczną update, i przekazujesz tam parametr this - czyli wskaźnik na obecną klase. Generalnie w konstruktorze jak byś zobaczył w dokumentacji stoi, że konstruktor **Thread (void(C::function)(), C object) przyjmuje wskaźnik na funkcję, oraz wskaźnik na obiekt, który powinien być parametrami. Może to być wskaźnik na typ prosty np. int i wtedy to wygląda tak:

void threadFunc(int argument)
{
    ...
}
sf::Thread thread(&threadFunc, 5);
thread.launch(); 

czyli w osobnym wątku wywołamy funkcje threadFunc z parametrem 5. Jeśli chciał byś przekazać 5 argumentów to musisz zrobić funkcję przyjmująca tablice lub strukturę z parametrami. Zacznijmy od zdefiniowania struktury:

struct Params
{
    int a;
    int b;
    int c;
    int d;
    int e;
};

teraz funkcje definiujemy tak:

void Func(Params p)
{
   if(p.a > p.b) .... 
}

no i definiujemy te parametry, tworzymy wątek, przekazujemy je do funkcji wątku i uruchamiamy

Params newParams {1, 2, 3, 4, 5}
sf::Thread watek(&Func, newParams);
watek.launch();

Mam nadzieję, że rozumiesz. Poczytaj o przekazywaniu struktur i obiektów do funkcji bo tutaj musisz definitywnie przekazywać obiekt czy strukturę. Nie poruszę tematu kolejek bo widzę, że jeszcze na to nie czas, bo nie masz problemu z “dorzucaniem” do wątku, a z samym wywołaniem asynchronicznie wieloparametrowej metody. Napisz czy rozumiesz, ew. wklej swój kod jak nie zadziała ale pamiętaj o przerzuceniu przez formator który za linkowałem!

Dobra, sorry, trochę mnie poniosło.
Ale w takim razie w tym miejscu przy konstruktorze muszę wyrzucić to thr(&Ped::update, this) muszę wyrzucic, w funkcji za każdym wywołaniem muszę umieścić thr = new sf::Thread(&Ped::goToCoords, p); a sf::Thread thr w ped.h muszę zrobić sf::Thread *thr; żeby wszystko było w porządku, żebym mógł za każdym razem przeinicjować ten thr. No i od razu zamiast wywoływać funkcję GoToCoords(blablabla); zrobić thr.launch();, wiec mniej więcej.
ped.h:
#ifndef FPED
#define FPED
#include
#include
#include
#include <errno.h>
#include
#ifndef _WIN32
#include <unistd.h>
#include <semaphore.h>
#include <speech-dispatcher/libspeechd.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <dirent.h>
#include <wait.h>
#include <signal.h>
#endif
#include
#include <SFML/Graphics.hpp>
#include <SFML/System.hpp>
#include <audio.h>
#include <system.h>
#include <logger.h>
#include <helpers.h>
class Ped
{
public:
enum PED_TYPE
{
CAT,
COW,
DOG,
HUMAN
};
struct arg
{
int index;
float x;
float y;
float z;
PED_TYPE t;
};
Ped();
~Ped(void);
void installAudio(Audio& a);
void launchThread();
void terminateThread();
void createRandomPedsAt3DCoords(int c, float x, float y, float z);
void del(int index);
void setCoords(int index, float& x, float& y, float& z);
int getSize();
void setHealth(int index, int h);
int getHealth(int index);
void update(void);
void goToCoords(arg a);
PED_TYPE getType(int index);
Vector3D getCoords(int index);

private:
struct Pedd
{
sf::Vector2f speed;
bool big;
float x;
float y;
float z;
PED_TYPE t;
int health;
sf::Clock clk[2];
sf::Time tim[2];
int jump;
int interval;
bool missionflag;
};
vector a_ped;
struct 5arg
{
int index;
float x;
float y;
float z;
PED_TYPE t;
};
Audio* audio;
sf::Clock clock[1024];
sf::Time czas[1024];
sf::Thread* thr;
sf::Mutex mu;
};
#endif
następnie:
#include <ped.h>
Ped::Ped()
{
logmsg(“Ped: spawn”);
createRandomPedsAt3DCoords(1000, 0, 0, 0);
}
Ped::~Ped(void)
{
logmsg(“Ped: destroy”);
for (int i = 0; i < getSize(); i++) {
del(i);
}
}
void
Ped::installAudio(Audio& a)
{
this->audio = &a;
}
void
Ped::createRandomPedsAt3DCoords(int peds, float _x, float _y, float _z)
{
logmsg(“Ped: creating %i peds at %.1f %.1f %.1f”, peds, _x, _y, _z);
srand(time(NULL));
for (int i = 0; i < peds; i++) {
Pedd pd;
pd.big = false;
pd.health = 100;
pd.jump = 1;
if (_x == 0 && _y == 0 && _z == 0) {
if (rand() % 10 > 4)
pd.big = true;
else
pd.big = false;
pd.x = rand() % 6000;
pd.y = rand() % 6000;
pd.z = 0;
} else {
pd.x = _x;
pd.y = _y;
pd.z = _z;
}
if (i <= 100) {
pd.t = CAT;
pd.interval = 10;
} else if (i > 100 && i <= 200) {
pd.t = COW;
pd.interval = 20;
} else if (i > 200 && i <= 300) {
pd.t = DOG;
pd.interval = 10;
} else if (i > 300 && i <= peds) {
pd.t = HUMAN;
pd.interval = 22;
}
int radius = 40;
if (pd.big)
radius *= 1.5;
float vx, vy;
vx = (rand() % 2) + 1;
vy = (rand() % 2) + 1;
if (rand() % 2 == 0)
vx *= -1;
if (rand() % 2 == 0)
vy *= -1;
pd.speed = sf::Vector2f(vx / 1.5, vy / 1.5);
a_ped.push_back(pd);
}
logmsg(“Ped: done”);
}
void
Ped::del(int in)
{
for (int i = in; i < a_ped.size() - 1; i++) {
swap(a_ped[i], a_ped[i + 1]);
}
a_ped.resize(a_ped.size() - 1);
}
int
Ped::getSize()
{
return a_ped.size();
}
Ped::PED_TYPE
Ped::getType(int index)
{
return a_ped[index].t;
}
void
Ped::setHealth(int index, int h)
{
a_ped[index].health = h;
}
int
Ped::getHealth(int index)
{
return a_ped[index].health;
}
void
Ped::setCoords(int ind, float& xx, float& yy, float& zz)
{
a_ped[ind].x = xx;
a_ped[ind].y = yy;
a_ped[ind].z = zz;
}
void
Ped::update()
{

srand(time(NULL));
if (getSize() > 0) {
for (int d = 0; d < getSize(); d++) {
logmsg(“Updating PED %i”, d);
if ((a_ped[d].t == CAT)) {
czas[0] = clock[0].getElapsedTime();
int los1 = rand() % 60;
int los2 = rand() % 60;
if (czas[0].asSeconds() <= los1) {
a_ped[d].tim[2] = a_ped[d].clk[2].getElapsedTime();
if (a_ped[d].tim[2].asSeconds() >= 5) {
audio->play3DSound(audio->MEOF01, a_ped[d].x, a_ped[d].y,
a_ped[d].z);
a_ped[d].clk[2].restart();
}
if (a_ped[d].x <= -2000) {
int cx = rand() % 20;
// goToCoords(d, a_ped[d].x + cx, a_ped[d].y, 0, CAT);
arg ar = { d, a_ped[d].x + cx, a_ped[d].y, a_ped[d].z, CAT };
thr = new sf::Thread(&Ped::goToCoords, &ar);
thr->launch();
} else if (a_ped[d].x >= 2000) {
int cx = rand() % 20;
// goToCoords(d, a_ped[d].x - cx, a_ped[d].y, 0, CAT);
arg ar = { d, a_ped[d].x - cx, a_ped[d].y, a_ped[d].z, CAT };
thr = new sf::Thread(&Ped::goToCoords, &ar);
thr->launch();
}
if (a_ped[d].y <= -2000) {
int cy = rand() % 20;
// goToCoords(d, a_ped[d].x, a_ped[d].y + cy, 0, CAT);
arg ar = { d, a_ped[d].x, a_ped[d].y + cy, a_ped[d].z, CAT };
thr = new sf::Thread(&Ped::goToCoords, &ar);
thr->launch();
} else if (a_ped[d].y >= 2000) {
int cy = rand() % 20;
// goToCoords(d, a_ped[d].x, a_ped[d].y - cy, 0, CAT);
arg ar = { d, a_ped[d].x, a_ped[d].y - cy, a_ped[d].z, CAT };
thr = new sf::Thread(&Ped::goToCoords, &ar);
thr->launch();
}
} else if (czas[0].asSeconds() > los1 && czas[0].asSeconds() <= los2) {
a_ped[d].tim[1] = a_ped[d].clk[1].getElapsedTime();
if (a_ped[d].tim[1].asSeconds() >= 5) {
audio->play3DSound(audio->PURE01, a_ped[d].x, a_ped[d].y,
a_ped[d].z);
audio->setSoundLoop(audio->PURE01, true);
a_ped[d].clk[1].restart();
}
if (a_ped[d].x <= -2000) {
int cx = rand() % 20;
// goToCoords(d, a_ped[d].x + cx, a_ped[d].y, 0, CAT);
arg ar = { d, a_ped[d].x + cx, a_ped[d].y, a_ped[d].z, CAT };
thr = new sf::Thread(&Ped::goToCoords, &ar);
thr->launch();
} else if (a_ped[d].x >= 2000) {
int cx = rand() % 20;
// goToCoords(d, a_ped[d].x - cx, a_ped[d].y, 0, CAT);
arg ar = { d, a_ped[d].x - cx, a_ped[d].y, a_ped[d].z, CAT };
thr = new sf::Thread(&Ped::goToCoords, &ar);
thr->launch();
}
if (a_ped[d].y <= -2000) {
int cy = rand() % 20;
// goToCoords(d, a_ped[d].x, a_ped[d].y + cy, 0, CAT);
arg ar = { d, a_ped[d].x, a_ped[d].y + cy, a_ped[d].z, CAT };
thr = new sf::Thread(&Ped::goToCoords, &ar);
thr->launch();
} else if (a_ped[d].y >= 2000) {
int cy = rand() % 20;
// goToCoords(d, a_ped[d].x, a_ped[d].y - cy, 0, CAT);
arg ar = { d, a_ped[d].x, a_ped[d].y - cy, a_ped[d].z, CAT };
thr = new sf::Thread(&Ped::goToCoords, &ar);
thr->launch();
}

      clock[0].restart();
    }
  } else if ((a_ped[d].t = COW)) {
    czas[1] = clock[1].getElapsedTime();
    int los1 = rand() % 60;
    int los2 = rand() % 120;
    if (czas[1].asSeconds() >= los1) {
      a_ped[d].tim[2] = a_ped[d].clk[2].getElapsedTime();
      if (a_ped[d].tim[2].asSeconds() > 5) {
        int sound0 = rand() % 2;
        if (sound0 == 0) {
          audio->play3DSound(audio->M01, a_ped[d].x, a_ped[d].y,
                             a_ped[d].z);
        } else if (sound0 != 0) {
          audio->play3DSound(audio->M02, a_ped[d].x, a_ped[d].y,
                             a_ped[d].z);
        }
        a_ped[d].clk[2].restart();
      }
      if (a_ped[d].x <= -3000) {
        int cx = rand() % 20;
        // goToCoords(d, a_ped[d].x + cx, a_ped[d].y, 0, COW);
        arg ar = { d, a_ped[d].x + cx, a_ped[d].y, a_ped[d].z, COW };
        thr = new sf::Thread(&Ped::goToCoords, &ar);
        thr->launch();
      } else if (a_ped[d].x >= 3000) {
        int cx = rand() % 20;
        // goToCoords(d, a_ped[d].x - cx, a_ped[d].y, 0, COW);
        arg ar = { d, a_ped[d].x - cx, a_ped[d].y, a_ped[d].z, COW };
        thr = new sf::Thread(&Ped::goToCoords, &ar);
        thr->launch();
      }
      if (a_ped[d].y <= -3000) {
        int cy = rand() % 20;
        // goToCoords(d, a_ped[d].x, a_ped[d].y + cy, 0, COW);
        arg ar = { d, a_ped[d].x, a_ped[d].y + cy, a_ped[d].z, COW };
        thr = new sf::Thread(&Ped::goToCoords, &ar);
        thr->launch();
      } else if (a_ped[d].y >= 3000) {
        int cy = rand() % 20;
        // goToCoords(d, a_ped[d].x, a_ped[d].y - cy, 0, COW);
        arg ar = { d, a_ped[d].x, a_ped[d].y - cy, a_ped[d].z, COW };
        thr = new sf::Thread(&Ped::goToCoords, &ar);
        thr->launch();
      }
    } else if (czas[2].asSeconds() > los2) {
      a_ped[d].tim[1] = a_ped[d].clk[1].getElapsedTime();
      if (a_ped[d].tim[1].asSeconds() > 5) {
        audio->play3DSound(audio->M03, a_ped[d].x, a_ped[d].y, a_ped[d].z);
        a_ped[d].clk[1].restart();
      }
      clock[1].restart();
    }
  } else if ((a_ped[d].t == DOG)) {
    czas[2] = clock[2].getElapsedTime();
    int los1 = rand() % 60;
    int los2 = rand() % 60;
    if (czas[2].asSeconds() <= los1) {
      a_ped[d].tim[2] = a_ped[d].clk[2].getElapsedTime();
      if (a_ped[d].tim[2].asSeconds() >= 5) {
        int sound1 = rand() % 2;
        if (sound1 == 0)
          audio->play3DSound(audio->DOG01, a_ped[d].x, a_ped[d].y,
                             a_ped[d].z);
        else if (sound1 != 0)
          audio->play3DSound(audio->DOG02, a_ped[d].x, a_ped[d].y,
                             a_ped[d].z);
        a_ped[d].clk[2].restart();
      }
      if (a_ped[d].x <= -2000) {
        int cx = rand() % 20;
        // goToCoords(d, a_ped[d].x + cx, a_ped[d].y, 0, DOG);
        arg ar = { d, a_ped[d].x + cx, a_ped[d].y, a_ped[d].z, DOG };
        thr = new sf::Thread(&Ped::goToCoords, &ar);
        thr->launch();
      } else if (a_ped[d].x >= 2000) {
        int cx = rand() % 20;
        // goToCoords(d, a_ped[d].x - cx, a_ped[d].y, 0, DOG);
        arg ar = { d, a_ped[d].x - cx, a_ped[d].y, a_ped[d].z, DOG };
        thr = new sf::Thread(&Ped::goToCoords, &ar);
        thr->launch();
      }
      if (a_ped[d].y <= -2000) {
        int cy = rand() % 20;
        // goToCoords(d, a_ped[d].x, a_ped[d].y + cy, 0, DOG);
        arg ar = { d, a_ped[d].x, a_ped[d].y + cy, a_ped[d].z, DOG };
        thr = new sf::Thread(&Ped::goToCoords, &ar);
        thr->launch();
      } else if (a_ped[d].y >= 2000) {
        int cy = rand() % 20;
        // goToCoords(d, a_ped[d].x, a_ped[d].y - cy, 0, DOG);
        arg ar = { d, a_ped[d].x, a_ped[d].y - cy, a_ped[d].z, DOG };
        thr = new sf::Thread(&Ped::goToCoords, &ar);
        thr->launch();
      }
    } else if (czas[2].asSeconds() > los1 && czas[2].asSeconds() <= los2) {
      a_ped[d].tim[1] = a_ped[d].clk[1].getElapsedTime();
      if (a_ped[d].tim[1].asSeconds() >= 5) {
        audio->play3DSound(audio->DOG03, a_ped[d].x, a_ped[d].y,
                           a_ped[d].z);
        a_ped[d].clk[1].restart();
      }
      if (a_ped[d].x <= -2000) {
        int cx = rand() % 20;
        // goToCoords(d, a_ped[d].x + cx, a_ped[d].y, 0, DOG);
        arg ar = { d, a_ped[d].x + cx, a_ped[d].y, a_ped[d].z, DOG };
        thr = new sf::Thread(&Ped::goToCoords, &ar);
        thr->launch();
      } else if (a_ped[d].x >= 2000) {
        int cx = rand() % 20;
        // goToCoords(d, a_ped[d].x - cx, a_ped[d].y, 0, DOG);
        arg ar = { d, a_ped[d].x - cx, a_ped[d].y, a_ped[d].z, DOG };
        thr = new sf::Thread(&Ped::goToCoords, &ar);
        thr->launch();
      }
      if (a_ped[d].y <= -2000) {
        int cy = rand() % 20;
        // goToCoords(d, a_ped[d].x, a_ped[d].y + cy, 0, DOG);
        arg ar = { d, a_ped[d].x, a_ped[d].y + cy, a_ped[d].z, DOG };
        thr = new sf::Thread(&Ped::goToCoords, &ar);
        thr->launch();
      } else if (a_ped[d].y >= 2000) {
        int cy = rand() % 20;
        // goToCoords(d, a_ped[d].x, a_ped[d].y - cy, 0, DOG);
        arg ar = { d, a_ped[d].x, a_ped[d].y - cy, a_ped[d].z, DOG };
        thr = new sf::Thread(&Ped::goToCoords, &ar);
        thr->launch();
      }
      clock[2].restart();
    }
  }
  if (a_ped[d].health == 0) {
    del(d);
  }
  if (a_ped[d].x > 11000) {
    a_ped[d].x = 11000;
  } else if (a_ped[d].y > 11000) {
    a_ped[d].y = 11000;
  }
}

}
}
void
Ped::goToCoords(Ped::arg a)
{
int ind = a.index;
PED_TYPE t = a.t;
do {
a_ped[ind].tim[0] = a_ped[ind].clk[0].getElapsedTime();
if (a_ped[ind].tim[0].asMilliseconds() >= a_ped[ind].interval) {
if (a_ped[ind].x < a.x) {
a_ped[ind].x += 1;
} else if (a_ped[ind].x > a.x) {
a_ped[ind].x -= 1;
}
if (a_ped[ind].y < a.y) {
a_ped[ind].y += 1;
} else if (a_ped[ind].y > a.y) {
a_ped[ind].y -= 1;
}
if (t == CAT || t == DOG) {
audio->play3DSound(audio->STEP7, a_ped[ind].x, a_ped[ind].y,
a_ped[ind].z);
} else if (t == HUMAN) {
audio->play3DSound(audio->STEP6, a_ped[ind].x, a_ped[ind].y,
a_ped[ind].z);
} else if (t == COW) {
audio->play3DSound(audio->STEP8, a_ped[ind].x, a_ped[ind].y,
a_ped[ind].z);
}
a_ped[ind].clk[0].restart();
}
} while (a_ped[ind].x != a.x || a_ped[ind].y != a.y || a_ped[ind].z != a.z);
}
void
Ped::launchThread()
{
thr->launch();
}
void
Ped::terminateThread()
{
thr->terminate();
}
Vector3D
Ped::getCoords(int index)
{
return { a_ped[index].x, a_ped[index].y, a_ped[index].z };
}
ale
In file included from /usr/include/SFML/System/Thread.hpp:193:0,
from /usr/include/SFML/System.hpp:43,
from /usr/include/SFML/Window.hpp:32,
from /usr/include/SFML/Graphics.hpp:32,
from ./headers/ped.h:19,
from ped.cpp:1:
/usr/include/SFML/System/Thread.inl: In instantiation of ‘void sf::priv::ThreadFunctorWithArg<F, A>::run() [with F = void (Ped::)(Ped::arg); A = Ped::arg]’:
ped.cpp:433:1: required from here
/usr/include/SFML/System/Thread.inl:48:25: error: must use ‘.’ or ‘->’ to call pointer-to-member function in ‘((sf::priv::ThreadFunctorWithArg<void (Ped::)(Ped::arg),
Ped::arg
>)this)->sf::priv::ThreadFunctorWithArg<void (Ped::)(Ped::arg), Ped::arg*>::m_function (…)’, e.g. ‘(… ->* ((sf::priv::ThreadFunctorWithArg<void (Ped::)(
Ped::arg), Ped::arg
>)this)->sf::priv::ThreadFunctorWithArg<void (Ped::)(Ped::arg), Ped::arg*>::m_function) (…)’
virtual void run() {m_function(m_arg);}
^~~~~~~~~~

No i nie ma tego formatowania, a wkleiłem razem z nim.

Próbowałem jeszcze zrobić std::bind, ale przy podaniu tych 5 argumentów, z których ostatecznie składa się funkcja, sorry, z 4, wyskakuje mi błąd podczas kompilacji.
ped.cpp:188:75: error: invalid use of non-static member function ‘void Ped::goToCoords(int, float, float, float)’
auto ar = std::bind(goToCoords, d, a_ped[d].x, a_ped[d].y - cy, a_ped[d].z);

Nie pisz tutaj kodu jak nie potrafisz tego sformatować, tylko załącz pliki cpp oraz pliki h, jeśli masz jakiś makefile to też możesz dorzucić. W tej sieczce co przedstawiłeś, bez pełnego codebase do kompilacji nie za bardzo można się poruszać, a tez nie będę poświęcał tyle czasu, żeby dojść gdzie i co chciałeś osiągnąć z tego elementu kodu. Załącz pliki to wieczorem pooglądam sobie pod IDE i zobaczę jakim błędem pluje.

http://0777.pl/code.zip