Bon je ne sais pas pourquoi mais en fait, quand on fait l'affichage autre part que dans le thread main, ça ne marche pas, ça, ça marche mieux : (J'en ai profité pour passer par Qt pour faire l'affichage dans un thread.)
#include "mycanvas.h"
using namespace sf;
using namespace std;
MyCanvas::MyCanvas(QWidget* Parent, const QPoint& Position, const QSize& Size) : QSFMLCanvas(Parent, Position, Size, 60) {
sceneUpdater = new SceneUpdater();
text.create(Size.width(), Size.height());
}
void MyCanvas::onInit() {
sceneUpdater->start();
}
void MyCanvas::onUpdate() {
unique_lock<mutex> locker(g_lock_update_component);
g_signal.wait(locker, [&](){return sceneUpdater->isGDone();});
clear(Color::Black);
text.clear(Color::Black);
text.draw(sceneUpdater->getRectangle());
text.display();
draw(Sprite(text.getTexture()));
}
#include "updater.h"
using namespace std;
using namespace sf;
SceneUpdater::SceneUpdater() {
rectangle = RectangleShape(Vector2f(0, 0));
rectangle.setSize(Vector2f(100, 100));
running = gDone = false;
}
bool SceneUpdater::isGDone() {
return gDone;
}
void SceneUpdater::start() {
running = true;
m_thread = thread (&SceneUpdater::run, this);
}
void SceneUpdater::stop() {
running = false;
m_thread.join();
}
void SceneUpdater::run() {
while (running) {
unique_lock<mutex> locker(g_lock_update_component);
gDone=false;
int posX = rand() % 800;
int posY = rand() % 600;
rectangle.setPosition(posX, posY);
gDone = true;
g_signal.notify_one();
this_thread::sleep_for(chrono::milliseconds(100));
}
}
RectangleShape& SceneUpdater::getRectangle () {
return rectangle;
}
#include "mycanvas.h"
#include <ctime>
#include <QtWidgets/QMainWindow>
#include <QtWidgets/QApplication>
using namespace std;
int main (int argc, char* argv[]) {
QApplication app (argc, argv);
srand(time(NULL));
QMainWindow *mainWindow = new QMainWindow();
mainWindow->resize(QSize(800, 600));
MyCanvas my_canvas (mainWindow, QPoint(0, 0), QSize(800, 600));
mainWindow->show();
return app.exec();
}
La sfml possède pas mal de limitations, trop même, ce bout de code est vachement plus rapide que d'utiliser un mutex.
Tu devrait quand même impélmenter les variables de conditions dans la SFML.
Et c'est pas une question d'OS vu que quand je fais l'affichage avec Qt, ça marche.
A ce que je sache QTimer utilise un thread non ?