Je voulais faire un programme de test simple en C avec SDL 1.2, et il plante : - Au bout de quelques secondes de fonctionnement. - Quand on clique dans la fenêtre. - Quand on appuie une touche du clavier.
Oui c'est possible.. Je viens de faire quelques tests et j'ai l'impression que ça ne marche plus à partir du moment où je met une boucle justement. Quand je met une boucle while ou même une for avec un nombre très grand pour répéter mon programme, ça re-plante... Sauf que dans mon vrais programme (pas celui là qui me sert que de test) j'ai besoin d'une boucle comme celle ci. :/
J'ai une explication (a propos de ton premier post)
Ce qui me met la puce à l'oreille, c'est ton screenshot de l'erreur.
Ce n'est pas "ce programme a cessé de fonctionner" (un plantage), mais "ce programme ne répond pas" : c'est pas pareil. C'est un programme qui n'échange plus de messages avec l'OS, il tourne mais il ne dialogue plus. Et Windows n'aime pas ça.
Et a mon avis, ça vient du fait quand tu fais ta boucle, tu ne dépiles pas les events : du coup, ils s'accumulent dans la file, et la sature probablement. Et c'est pas bon du tout. Et je pense que d'une manière ou d'une autre, Windows considère que ton application ne répond pas, car elle ne dépile rien que Windows lui envoie.
Si tu veux une analogie : c'est comme si Windows était un facteur, et que ton programme a une boîte aux lettres. Windows lui envoie des messages, et au bout d'un certain temps, il se rend compte que la boîte aux lettre déborde. Et c'est la qu'on peut se dire "le programme ne répond pas" (ie : le mec ne relève plus sa boîte aux lettres, c'est bizarre)
Pour résoudre ce soucis, prend ton premier code et tout au début de ton while, ligne 18, écris :
SDL_Event event;
while(SDL_PollEvent(&event)){}
Voila, avec ça tu dépile les évents (et on n'en fait rien)
Mais c'est vrai qu'à terme, il faudra les gérer au moins pour sortir proprement de ton programme.
Je sais pas si c’est bien ici que je devais l’insérer, mais ça ne bug plus Par contre quand je le fais avec mon vrais programme de plus de 700 lignes ça ne fonctionne toujours pas. :/ Il y a exactement les mêmes symptômes que pour le programme de test. Ce que je vais faire c'est réduire le vrais programme(une version copiée-collée) étape par étape jusqu'à ce que le bug n'apparait plus, pour tester...
Je viens de me rendre compte que ce bout de code bloque les autres events de mon programme. Quand j’appuie une touche par exemple, ça ne fait plus rien.
SDL_Event event;
while(SDL_PollEvent(&event)){}
tp_p = SDL_GetTicks () ;
SDL_PollEvent (&ev) ;
// Ceci ne marche plus :
if (ev.type==SDL_KEYDOWN)
{
switch (ev.key.keysym.sym)
{
case SDLK_ESCAPE : cont = 0 ; break ;
//case SDL_QUIT : cont = 0 ; break ;
case SDLK_RIGHT : key = 'r' ; break ;
case SDLK_LEFT : key = 'l' ; break ;
case SDLK_UP : key = 'u' ; break ;
case SDLK_DOWN : key = 'd' ; break ;
case SDLK_RCTRL : key = 'c' ; break ;
case SDLK_LCTRL : key = 'c' ; break ;
case SDLK_LESS : key = 'c' ; break ;
case SDLK_GREATER : key = 'c' ; break ;
case SDLK_RSHIFT : key = 's' ; break ;
case SDLK_LSHIFT : key = 's' ; break ;
}
}
@yo@n97one : C'est vrais, mais le truc c'est que j'aimerais garder mon projet un peu secret. Du coup tout montrer serait une dernière issus, si vraiment personne peut m'aider comme ça...
Par contre du coup j'ai pas compris pourquoi il faut dépiler (dans le 1er exemple) alors que ce programme n'utilise pas d'events ? Il n'y a rien qui s'accumule du coup ?
Je viens de faire les tests en enlevant de plus en plus de bouts de codes pour voir à quel moment ça ne plante plus, et le résultat est vraiment bizarre. Au fur à mesure que j'enlève des fonctions SDL_BlitSurface ou SDL_Flip (ecran) il devient de plus en plus difficile à faire buger le programme. Genre la durée qu'il met avant de buger devient de plus en plus longue. Une fois que j'ai tout enlevé il ne buge plus que quand je le minimise.
Par contre du coup j'ai pas compris pourquoi il faut dépiler (dans le 1er exemple) alors que ce programme n'utilise pas d'events ? Il n'y a rien qui s'accumule du coup ?
Je viens de faire les tests en enlevant de plus en plus de bouts de codes pour voir à quel moment ça ne plante plus, et le résultat est vraiment bizarre. Au fur à mesure que j'enlève des fonctions SDL_BlitSurface ou SDL_Flip (ecran) il devient de plus en plus difficile à faire buger le programme. Genre la durée qu'il met avant de buger devient de plus en plus longue. Une fois que j'ai tout enlevé il ne buge plus que quand je le minimise.
- Edité par C++eur il y a environ 9 heures
Dès que tu bouges la souris, que tu appuies sur une touche, ça lance un event. je t'ai dit, c'est comme un facteur qui met des lettres dans une boite aux lettres. Il faut la vider au fur et à mesure, sinon le facteur un moment, il se dit "le mec ne relève plus rien, il est mort". Voila, le facteur c'est Windows.
Pour ton 2e problème, ça ne doit pas être sur le bout de code du 1er paragraphe mais un autre.
SDL qui finit par planter au bout d'un moment, et plus rarement quand tu allèges, ça sent la mémoire qui explose : regarde ton occupation mémoire dans le gestionnaire de processus : je pense que tu dois avoir une belle courbe montante, et à un moment, l'OS dit stop.
Si c'est le cas, c'est que tu ne désalloues pas toutes les surfaces que tu alloues. Et ça dans une boucle.
Non seulement Windows surveille ses processus, mais de plus en plus d'antivirus ont également tendance à surveiller un peu tout avec souvent plus de zèle que Windows pour traquer tout comportement inhabituel ou suspect.
Non seulement Windows surveille ses processus, mais de plus en plus d'antivirus ont également tendance à surveiller un peu tout avec souvent plus de zèle que Windows pour traquer tout comportement inhabituel ou suspect.
Remarque, c'est pas forcément plus mal, ça oblige les programmeurs à faire "au moins un peu propre" leurs programmes
Dès que tu bouges la souris, que tu appuies sur une touche, ça lance un event. je t'ai dit, c'est comme un facteur qui met des lettres dans une boite aux lettres. Il faut la vider au fur et à mesure, sinon le facteur un moment, il se dit "le mec ne relève plus rien, il est mort". Voila, le facteur c'est Windows.
Donc dès qu'il y a une boucle dans un programme avec SDL, il stocke les events, même si on en utilise pas ?
SDL qui finit par planter au bout d'un moment, et plus rarement quand tu allèges, ça sent la mémoire qui explose : regarde ton occupation mémoire dans le gestionnaire de processus : je pense que tu dois avoir une belle courbe montante, et à un moment, l'OS dit stop.
Je viens de tester et on ne vois rien d'anormale dans le gestionnaire de tâches. La courbe reste plate à un niveau normal.
Je vais tester en refaisant tout le projet mais avec SDL 2.
Oui, même quand TON programme tourne en boucle ou est en pause, les events sont quand-même empilés en background.
Et heureusement, sinon ça voudrait dire qu'il faudrait appuyer sur les touches pile au milliardième* de seconde où la lib se tournerait vers le clavier pour voir s'il s'y passe quelque chose...
Donc dès qu'il y a une boucle dans un programme avec SDL, il stocke les events, même si on en utilise pas ?
Même sans boucle. Dès qu’un évènement arrive, la SDL le stocke. C’est juste que puisqu’il y a une boucle et que tu ne lis pas les évènements, donc ils s’accumulent.
Je viens de tester et on ne vois rien d'anormale dans le gestionnaire de tâches. La courbe reste plate à un niveau normal.
La RAM n’augmente pas, il n’y a pas de consommation supplémentaire. C’est juste que puisque tu ne fais rien, il y a accumulation, l’OS se dit qu’il y a un truc bizarre.
Je désalloue bien toutes les surfaces mais tout à la fin du programme avec SDL_FreeSurface (...) ; Et pendant l’exécution de la boucle je ne désalloue rien puisque mon programme en a besoin. Ou alors j'ai pas bien compris un truc...
@Fvirtman Enfaite dans mon programme j'utilise qu'une seule variable SDL_Event et je l'utilise qu'une seul fois au début de la boucle avec le switch et juste avant j'ai : while(SDL_PollEvent (&ev)){} ; Je sais pas s'il faut le placer à un autre endroit du programme aussi ? dans tous les boucles for ?
× Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
× Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
Bonhomme !! | Jeu de plateforme : Prototype.
Bonhomme !! | Jeu de plateforme : Prototype.
Bonhomme !! | Jeu de plateforme : Prototype.
Bonhomme !! | Jeu de plateforme : Prototype.
Recueil de code C et C++ http://fvirtman.free.fr/recueil/index.html
Recueil de code C et C++ http://fvirtman.free.fr/recueil/index.html
Bonhomme !! | Jeu de plateforme : Prototype.
Recueil de code C et C++ http://fvirtman.free.fr/recueil/index.html
Recueil de code C et C++ http://fvirtman.free.fr/recueil/index.html
Bonhomme !! | Jeu de plateforme : Prototype.
Recueil de code C et C++ http://fvirtman.free.fr/recueil/index.html
Donc dès qu'il y a une boucle dans un programme avec SDL, il stocke les events, même si on en utilise pas ?
Bonhomme !! | Jeu de plateforme : Prototype.
Recueil de code C et C++ http://fvirtman.free.fr/recueil/index.html