File indexing completed on 2024-04-21 03:51:15

0001 /*.
0002     SPDX-FileCopyrightText: 2007 Vladimir Kuznetsov <ks.vladimir@gmail.com>
0003 
0004     SPDX-License-Identifier: GPL-2.0-or-later
0005 */
0006 
0007 #ifndef SIMULATIONTHREAD_H
0008 #define SIMULATIONTHREAD_H
0009 
0010 #include <QMutex>
0011 #include <QThread>
0012 #include <QWaitCondition>
0013 
0014 namespace StepCore {
0015     class World;
0016 }
0017 
0018 /**
0019  * Simulation thread only changes properties of items,
0020  * not their count or addresses, so locking is required for
0021  *  - any writes
0022  *  - reads of item properties
0023  *
0024  * @author Vladimir Kuznetsov
0025  */
0026 class SimulationThread: public QThread
0027 {
0028     Q_OBJECT
0029 
0030 public:
0031     explicit SimulationThread(StepCore::World** world)
0032         : _world(world), _stopThread(0), _delta(0) {}
0033     ~SimulationThread();
0034 
0035     void run() override;
0036     void doWorldEvolve(double delta);
0037     QMutex* mutex() { return &_mutex; }
0038 
0039 signals:
0040     void worldEvolveDone(int result);
0041 
0042 protected:
0043     StepCore::World** _world;
0044     bool              _stopThread;
0045     double            _delta;
0046     QMutex            _mutex;
0047     QWaitCondition    _waitCondition;
0048 };
0049 
0050 #endif // SIMULATIONTHREAD_H