using mutex to safely delete pendula

main
Benjamin Kraft 1 year ago
parent 2e571ca6d4
commit 2acb74bb44
  1. 14
      src/Simulation.cpp
  2. 2
      src/Simulation.h

@ -15,10 +15,14 @@ Simulation::Simulation() {
}; };
void Simulation::draw(QPainter *p, int screenSize) { void Simulation::draw(QPainter *p, int screenSize) {
pendulaMutex.lock();
double scale = screenSize * 0.95 / size; double scale = screenSize * 0.95 / size;
for (const auto pendulum : pendula) for (const auto pendulum : pendula)
pendulum->draw(p, scale); pendulum->draw(p, scale);
pendulaMutex.unlock();
} }
void Simulation::update() { void Simulation::update() {
@ -40,12 +44,14 @@ void Simulation::update() {
} }
void Simulation::clearPendula() { void Simulation::clearPendula() {
auto deleteLater = pendula; pendulaMutex.lock();
for (auto p : pendula)
delete p;
pendula.clear(); pendula.clear();
pendula.shrink_to_fit(); pendula.shrink_to_fit();
QThread::usleep(500000);
for (auto p : deleteLater) pendulaMutex.unlock();
delete p;
} }
void Simulation::addPendula(const std::vector<Pendulum *> &add) { void Simulation::addPendula(const std::vector<Pendulum *> &add) {

@ -2,6 +2,7 @@
#include <cstdint> #include <cstdint>
#include <QObject> #include <QObject>
#include <chrono> #include <chrono>
#include <mutex>
using namespace std::chrono; using namespace std::chrono;
@ -28,6 +29,7 @@ public slots:
private slots: private slots:
void update(); void update();
private: private:
std::mutex pendulaMutex;
QTimer * timer; QTimer * timer;
int updateInterval = 17; int updateInterval = 17;
std::vector<Pendulum *> pendula; std::vector<Pendulum *> pendula;

Loading…
Cancel
Save