Bonjour,

Depuis quelques temps je développe une application client/serveur et j'ai remarqué des plantages aléatoires de mon serveur sur les trois fonctions qui lisent ou écrivent dans ma base de donnée. La fréquence des plantages varie beaucoup. Il peut arriver que ça plante deux fois de suite ou alors au bout d'une centaine de passage sur ces fonctions. .
Peut être que cela ne vient pas des bases de données mais je pense malgré tout, vu que le code de mes fonctions est plutôt banal et que je ne suis pas en multithreading.
Sinon j'utilise WAMP avec MySql.

Les paramètres du QSqlTableModel sont par défaut. Et voilà, je ne sais que dire d'autre. .
Je poste ci-dessous la fonction qui cause le plus de plantage :

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
void Serveur::traitePacket2()
{
 
/// /////////////////////////////////////////////////////////////////
               /// Packet de connection de persos ///
/// /////////////////////////////////////////////////////////////////
 
//sf::Lock Lock(mutex);
 
sf::Packet packetAenvoyer;
recognized = false; // On précise au serveur que le joueur n'a pas encore été reconnu.
 
 
information->append("Test de reconnaissance du joueur dans la bdd.");
 
/// Re-sélection des données de la table
model->setTable("joueur");
model->select();
 
/// //// Test de reconnaissance du cochon dans la bdd //// ///
    for(int i = 0; i < model->rowCount(); i++)
    {
    QSqlRecord record;
    record = model->record(i); /// Lecture de la ligne i.
 
/// Comparaison des noms ///
    information->append(QString::fromStdString(joueurTest.nomJoueur));
    information->append(record.value(1).toString());
    information->append(QString::fromStdString(mdp));
    information->append(record.value(2).toString());
/// ////////////////////////
 
 
 
       if((joueurTest.nomJoueur == record.value(1).toString().toStdString()) && (mdp == record.value(2).toString().toStdString()))
       {
        nbBDD = i;
        recognized = true;
       }
 
 
    }
/// //////////////////////////////////////////////////////////
 
 
 
information->append("Recherche du client dans le serveur à qui renvoyer une réponse, positive ou négative.");
 
/// ////// Recherche du client qui a envoyé la requête ////// ///
        for (int b = 0; b < nbJoueurs; b++)
        {
 
        information->append(QString::fromStdString(client[b].adresseClient.ToString()));
        information->append(QString::fromStdString(joueurTest.adresse));
 
            if(joueurTest.adresse == client[b].adresseClient.ToString())
            {
            nbClient = b;
            foundAdresse = true; // On l'a reconnu, on termine la boucle.
            }
 
        }
/// /////////////////////////////////////////////////////////////
 
 
 
if (recognized == true) /// Si le cochon a été reconnu dans la BDD
{
 
QSqlRecord recordBis;
recordBis = model->record(nbBDD); /// Lecture de la ligne nbBDD, correspondante au joueur reconnu.
 
 
 
    if(recordBis.value(3).toString().toStdString() == "Connect") /// Si le joueur en question est déjà entrain de jouer.
    {
 
    information->append("Un client a essayé d'utiliser un compte déjà connecté !");
 
    packetAenvoyer << 7 << true << false << joueurTest.vie << joueurTest.nomJoueur << joueurTest.position.x << joueurTest.position.y
    << joueurTest.nbFrameCurrent  << joueurTest.angle << joueurTest.nbVictoire << joueurTest.nbDefaite << joueurTest.numPartie;
 
 
    client[nbClient].socketClient.Send(packetAenvoyer);
 
    }
 
 
    else /// Sinon, si le joueur n'est pas entrain de jouer.
    {
 
 
    packetAenvoyer << 2 << true << false << joueurTest.vie << joueurTest.nomJoueur << joueurTest.position.x << joueurTest.position.y
    << joueurTest.nbFrameCurrent  << joueurTest.angle << joueurTest.nbVictoire << joueurTest.nbDefaite << joueurTest.numPartie;
 
 
 
        if (foundAdresse == false)
        {
        information->append("Un client s'est déconnecté en pleine tentative de connection =/");
        }
        else /// Sinon, si on l'a trouvé, on lui envoie le packet pour lui annoncer q'il est connecté ! ///
        {
 
        information->append("Un joueur s'est connecté !");
 
        model->setTable("joueur");
        model->select();
        model->setData(model->index(nbR2, 3), QString::fromStdString("Connect")); // On met le joueur dans son état "playing".
        model->submitAll();
 
        oss.str("");
        oss << nbBDD;
        information->append(QString::fromStdString(oss.str()));
 
 
 
        /// Initialisation du nom du client.
        client[nbClient].nomClient = joueurTest.nomJoueur;
        client[nbClient].isChoosing = true; // Le client se retrouve devant le tableau de partie.
 
        client[nbClient].socketClient.Send(packetAenvoyer); // Connection du Joueur.
 
        }
 
 
 
    }
 
 
foundAdresse = false; // On reinitialise la variable pour le prochain tour de boucle.
 
 
}
 
 
 
 
 
else
{ /// Si le joueur n'a pas été reconnue
 
 
packetAenvoyer << 2 << false << false << joueurTest.vie << joueurTest.nomJoueur << joueurTest.position.x << joueurTest.position.y
<< joueurTest.nbFrameCurrent << joueurTest.angle << joueurTest.nbVictoire << joueurTest.nbDefaite << joueurTest.numPartie; // On annonce la non-connection du joueur.
 
 
 
 
    if (foundAdresse == false)
    {
    information->append("Un client s'est déconnecté en pleine tentative de connection =/");
    }
    else // Sinon, si on l'a trouvé, on lui envoie le packet pour lui annoncer ces mauvaises frappes.
    {
 
    client[nbClient].socketClient.Send(packetAenvoyer);
 
    }
 
foundAdresse = false; // On reinitialise la variable pour le prochain tour de boucle.
 
}
 
} /// /// Fin de la fonction du traitement du packet de connection /// ///
Peut être cela vient-il de ma manière d'utiliser les fonctions qui gèrent la base de donnée ?
Je peux donner quelques autres bizarreries si cela peut aider à mettre sur la voie :
Mon serveur se déconnecte de la bdd s'il reste trop longtemps ouvert.
Les lignes se rajoutent un peu n'importe comment dans la bdd, sans ordre précis, alors que je précise bien de rajouter une ligne à model->rowCount(). . .

Je suis également ouïe à d'autres causes potentielles de plantage d'une application de manière aléatoire car je suis vraiment dépité ^^

Je remercie ceux qui ont eu la patience de lire mon post et plus encore ceux qui pourront m'apporter ne serait-ce qu'un morceau de réponse =)

Merci d'avance

Malgré ces bugs très imprévisibles je continue à coder et j'ai pu m'apercevoir d'une chose qui je l'espère fera naître quelques idées sur l'origine du problème. .
En fait, parfois le passage dans ces fonctions se fait une centaine de fois sans que ça plante, et tout d'un coup, ça va se mettre à planter trois ou quatre fois de suite. Et puis quelques minutes plus tard, plus rien.
Du coup j'aurais aimé savoir s'il était probable que le problème vienne de WAMP avec MySql et non de mon code ?

Sinon je me demandais également si le fait que j'initialise des floats ou des doubles à 0 et non 0.f ou 0.0 pourrait poser problème ?

Merci d'avance

Je continue à proposer au cas où ^^
J'ai entendu parler du stack overflow. . . me semble-t-il =)
Et donc j'ai pensé au fait que je créais mes objets mais sans les détruire en fin de fonction. . . A part qu'ils se détruisent tout seul entièrement ?
Donc voilà j'aurais aimé savoir si ça peut faire potentiellement planté mon application car elle prend trop de mémoire par exemple ?
Même si elle ne semble pas faire laguer mon pc. . .


Merci d'avance =)