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


(arekk-99) #1

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?


#2

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ę.


(arekk-99) #3

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ę.


#4

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 ?


(arekk-99) #5

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żę.


#6

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.


(arekk-99) #7

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};
}


#8

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


(arekk-99) #9

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


#10

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


(arekk-99) #11

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.


#12

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!


(arekk-99) #13

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);}
^~~~~~~~~~


(arekk-99) #14

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


(arekk-99) #15

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);


#16

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.


(arekk-99) #17

http://0777.pl/code.zip