Sans thread, il marche, le problème vient, je pense, de l'utilisation de display() et de waitEvent() en même temps.
Vu que dans la 1.6 si je mettais des verrous pour que ces deux fonctions ne puissent s'exécuter en même temps, le code marchait.
Mais c'était vraiment du gaspillage vu que waitEvent va attendre un évènement donc il va bloquer l'affichage si aucun évènement ne survient.
Tandis que display() va quant à lui bloquer le processus de lecture d'évent puisque j'ai mis un setLimiteFrame(60)
./exe
do_wait: drmWaitVBlank returned -1, IRQs don't seem to be working correctly.
Try adjusting the vblank_mode configuration parameter.
Fermeture
#include <iostream>
#include <SFML/Graphics.hpp>
const int IMGPROSEC = 60;
void lance_afficher(void *data)
{
sf::RenderWindow * window = static_cast<sf::RenderWindow*>(data);
window->setFramerateLimit(IMGPROSEC);
while (window->isOpen())
{
window->clear();
// dessine tout...
window->display();
}
}
int main()
{
sf::RenderWindow window(sf::VideoMode(500, 500, 32), "titre");
window.setActive(false);
sf::Thread thread(&lance_afficher, &window);
// thread.launch();
sf::Event Event;
while (window.isOpen())
{
while (window.waitEvent(Event))
{
if(Event.type == sf::Event::Closed)
{
std::cout << "Fermeture" << std::endl;
window.close();
break;
}
}
}
window.display();
}
NB : je suis en train d'installer ddd pour voir exactement ce qu'il se passe.
EDIT : lancé avec ddd, il n'y a aucune erreur. Mais on ne voit pas le deuxième thread, je pense que le deuxième thread n'est pas exécuté.
EDIT2 : je pourrais faire un pollevent, utiliser sf::Clock et sf::Mutex pour limiter le rechargement des images, mais avec :
#include <iostream>
#include <SFML/Graphics.hpp>
const int IMGPROSEC = 60;
sf::Mutex * Mutex;
void lance_afficher(void *data)
{
sf::RenderWindow * window = static_cast<sf::RenderWindow*>(data);
window->setFramerateLimit(IMGPROSEC);
while (window->isOpen())
{
//std::cout << "!!" << std::endl;
Mutex->lock();
window->clear();
// dessine tout...
window->display();
Mutex->unlock();
}
}
int main()
{
Mutex = new sf::Mutex();
sf::RenderWindow window(sf::VideoMode(500, 500, 32), "titre");
window.setActive(false);
sf::Thread thread(&lance_afficher, &window);
thread.launch();
sf::Event Event;
while (window.isOpen())
{
Mutex->lock();
while (window.pollEvent(Event))
{
std::cout << "???" << std::endl;
Mutex->unlock();
if(Event.type == sf::Event::Closed)
{
std::cout << "Fermeture" << std::endl;
window.close();
break;
}
Mutex->lock();
}
Mutex->unlock();
}
}
Il n'affichera à chaque fois au plus 3 fois "
"
Et sur quelques tests j'ai même eu :
./exe
do_wait: drmWaitVBlank returned -1, IRQs don't seem to be working correctly.
Try adjusting the vblank_mode configuration parameter.
Fermeture
X Error of failed request: BadDrawable (invalid Pixmap or Window parameter)
Major opcode of failed request: 137 ()
Minor opcode of failed request: 6
Resource id in failed request: 0x5800001
Serial number of failed request: 749
Current serial number in output stream: 750
neckara@NeckDebian:~/Documents/Donnees/Test-Boucle_Lecture_ecriture$ ./exe
do_wait: drmWaitVBlank returned -1, IRQs don't seem to be working correctly.
Try adjusting the vblank_mode configuration parameter.
Fermeture
pure virtual method called
terminate called without an active exception
Abandon
Par contre si je décommente l'affichage des "!!!" j'ai :
./exe
do_wait: drmWaitVBlank returned -1, IRQs don't seem to be working correctly.
Try adjusting the vblank_mode configuration parameter.
Et tout fonctionne plutôt bien.
#include <iostream>
#include <SFML/Graphics.hpp>
const int IMGPROSEC = 60;
sf::Mutex * Mutex;
void lance_afficher(void *data)
{
sf::RenderWindow * window = static_cast<sf::RenderWindow*>(data);
window->setFramerateLimit(IMGPROSEC);
while (window->isOpen())
{
//std::cout << "!!" << std::endl;
Mutex->lock();
window->clear();
// dessine tout...
window->display();
Mutex->unlock();
}
}
int main()
{
Mutex = new sf::Mutex();
sf::RenderWindow window(sf::VideoMode(500, 500, 32), "titre");
window.setActive(false);
sf::Thread thread(&lance_afficher, &window);
thread.launch();
sf::Event Event;
while (window.isOpen())
{
Mutex->lock();
while (window.pollEvent(Event))
{
std::cout << "???" << std::endl;
Mutex->unlock();
if(Event.type == sf::Event::Closed)
{
std::cout << "Fermeture" << std::endl;
window.close();
break;
}
Mutex->lock();
}
Mutex->unlock();
}
}