Hi.
I'm trying to developp a game server able to at the same time :
- listen for new clients who may connect
- receive udp packets
- manage multiple games at the same time and process everything needeed for them to work
I made a class "Partie" which contains all my in-game processing fonctions, and multiple instances of "Partie" are declared in the main function. Each "Partie" contains an SFML thread (1) which is started when the game starts and contains all the processing functions of the game.
Another thread (2) is running to listen for incoming data packets and is supposed to process and call methods from "Partie" to interact with the main game engine.
And my problem is that when thread (2) calls a method from "Partie" which modifies variable from "Parties", it just crashes with a write access violation exeption. All the variables look fine, my guess is just that thread (2) can't for some reason access "Partie" variables...
If someone could explain me how premissions work with threads, it would be amazing !
My class "Partie" :
class Partie {
public:
Partie()
: localGameEngine(&Partie::gameEngineTheServerSide, this)
{
}
void setStartStatus(bool status);
void setClientsIp(IpAddress ip, int internalClientId);
void setClientsPort(unsigned short port, int internalClientId);
void setAndSendAseroid(Asteroid asteroidToProcess, IpAddress sourceIP, unsigned short sourcePort, int id);
void sendMissile(Missile missileToProcess, IpAddress sourceIP, unsigned short sourcePort);
void sendSpaceShip(Spaceship spaceshipToSend, IpAddress sourceIP, unsigned short sourcePort, int id);
IpAddress getClientIp(int clientId);
bool getGameStatus();
void setClientStatus(Client client, int id);
void startGame();
int deadSpaceShips = 0; //évidemment à changer dès que chaque shapceship aura un numéro clairement implémenté et que donc je pourrais les identifier chacun et vérifier si ils sont morts ou non
private:
Thread localGameEngine;
Client clients[MAX_CLIENTS_PER_GAME];
bool isStarted;
Asteroid asteroids[ASTEROIDS_TABLE_LENGTH];
void gameEngineTheServerSide();
void asteroidsNextFrame(Asteroid *asteroids);
Asteroid generateAsteroid(const int typeProbabilities[NB_TYPES]);
void noAsteroidExist(Asteroid *asteroids);
void initMissiles(Missile *missiles);
void initSpaceship(int id, Spaceship &spaceship);
bool asteroidManager(/*Asteroid *asteroids,*/ int &frames, float &secsInterval, bool &initGame, bool &reduce);
};
The code running on thread (2) :
if (dataType == DataType::Asteroid) {
Asteroid asteroid;
Uint32 nb;
packet >> nb;
int id = nb;
cout << "Asteroid " << id << " has been destroyed by " << originIp << endl ;
packet >> asteroid.speed >> asteroid.angle >> asteroid.angularVelocity >>
asteroid.exists >> asteroid.hasEnteredWindow;
// ConvexShape
Uint32 type;
packet >> type;
asteroid.type = type;
Uint32 count;
packet >> count;
ConvexShape convexShape;
convexShape.setPointCount(count);
// Points
/// Float
float x, y;
for (int i = 0; i < count; i++) {
packet >> x >> y;
convexShape.setPoint(i, Vector2f(x, y));
}
// Color
/// R, G, B = Uint8
Uint8 r, g, b;
packet >> r >> g >> b;
convexShape.setFillColor(Color::Color(r, g, b));
// Position
/// Float
packet >> x >> y;
convexShape.setPosition(x, y);
asteroid.shape = convexShape;
games[getGameID(originIp, originPort, waitingClients)].setAndSendAseroid(asteroid, originIp, originPort, id); //here is the method called
}
And here is the code of the method :
void Partie::setAndSendAseroid(Asteroid asteroidToProcess, IpAddress sourceIP, unsigned short sourcePort, int id)
{
asteroids[id] = asteroidToProcess; //I get the write access violation exception here
sendData(asteroidToProcess, id, sourceIP, sourcePort, true, clients);
}
I'm probably just stupid and doing something completely wrong, but if someone could at least explain me what am i doing wrong, it would be amazing.
Thanks.
Sorry for my somehow bad englishAnd feel free to ask me anything i could have forget to explain and you may need in order to help me, obviously