Use a mutex to lock access to internal ist

This commit is contained in:
Maschell 2020-08-13 13:27:32 +02:00
parent 5b387ffec1
commit e8ee63068b
2 changed files with 29 additions and 1 deletions

View File

@ -18,6 +18,7 @@
#define GUI_FRAME_H_ #define GUI_FRAME_H_
#include <vector> #include <vector>
#include <mutex>
#include <gui/GuiElement.h> #include <gui/GuiElement.h>
#include <gui/sigslot.h> #include <gui/sigslot.h>
@ -119,6 +120,7 @@ protected:
bool dim; //! Enable/disable dim of a window only bool dim; //! Enable/disable dim of a window only
GuiFrame *parent; //!< Parent Window GuiFrame *parent; //!< Parent Window
std::vector<GuiElement *> elements; //!< Contains all elements within the GuiFrame std::vector<GuiElement *> elements; //!< Contains all elements within the GuiFrame
std::recursive_mutex mutex;
}; };
#endif #endif

View File

@ -52,8 +52,10 @@ void GuiFrame::append(GuiElement *e) {
} }
remove(e); remove(e);
mutex.lock();
elements.push_back(e); elements.push_back(e);
e->setParent(this); e->setParent(this);
mutex.unlock();
} }
void GuiFrame::insert(GuiElement *e, uint32_t index) { void GuiFrame::insert(GuiElement *e, uint32_t index) {
@ -62,8 +64,10 @@ void GuiFrame::insert(GuiElement *e, uint32_t index) {
} }
remove(e); remove(e);
mutex.lock();
elements.insert(elements.begin() + index, e); elements.insert(elements.begin() + index, e);
e->setParent(this); e->setParent(this);
mutex.unlock();
} }
void GuiFrame::remove(GuiElement *e) { void GuiFrame::remove(GuiElement *e) {
@ -71,16 +75,20 @@ void GuiFrame::remove(GuiElement *e) {
return; return;
} }
mutex.lock();
for (uint32_t i = 0; i < elements.size(); ++i) { for (uint32_t i = 0; i < elements.size(); ++i) {
if (e == elements[i]) { if (e == elements[i]) {
elements.erase(elements.begin() + i); elements.erase(elements.begin() + i);
break; break;
} }
} }
mutex.unlock();
} }
void GuiFrame::removeAll() { void GuiFrame::removeAll() {
mutex.lock();
elements.clear(); elements.clear();
mutex.unlock();
} }
void GuiFrame::close() { void GuiFrame::close() {
@ -95,6 +103,7 @@ GuiElement *GuiFrame::getGuiElementAt(uint32_t index) const {
if (index >= elements.size()) { if (index >= elements.size()) {
return NULL; return NULL;
} }
return elements[index]; return elements[index];
} }
@ -105,44 +114,53 @@ uint32_t GuiFrame::getSize() {
void GuiFrame::resetState() { void GuiFrame::resetState() {
GuiElement::resetState(); GuiElement::resetState();
mutex.lock();
for (uint32_t i = 0; i < elements.size(); ++i) { for (uint32_t i = 0; i < elements.size(); ++i) {
elements[i]->resetState(); elements[i]->resetState();
} }
mutex.unlock();
} }
void GuiFrame::setState(int32_t s, int32_t c) { void GuiFrame::setState(int32_t s, int32_t c) {
GuiElement::setState(s, c); GuiElement::setState(s, c);
mutex.lock();
for (uint32_t i = 0; i < elements.size(); ++i) { for (uint32_t i = 0; i < elements.size(); ++i) {
elements[i]->setState(s, c); elements[i]->setState(s, c);
} }
mutex.unlock();
} }
void GuiFrame::clearState(int32_t s, int32_t c) { void GuiFrame::clearState(int32_t s, int32_t c) {
GuiElement::clearState(s, c); GuiElement::clearState(s, c);
mutex.lock();
for (uint32_t i = 0; i < elements.size(); ++i) { for (uint32_t i = 0; i < elements.size(); ++i) {
elements[i]->clearState(s, c); elements[i]->clearState(s, c);
} }
mutex.unlock();
} }
void GuiFrame::setVisible(bool v) { void GuiFrame::setVisible(bool v) {
visible = v; visible = v;
mutex.lock();
for (uint32_t i = 0; i < elements.size(); ++i) { for (uint32_t i = 0; i < elements.size(); ++i) {
elements[i]->setVisible(v); elements[i]->setVisible(v);
} }
mutex.unlock();
} }
int32_t GuiFrame::getSelected() { int32_t GuiFrame::getSelected() {
// find selected element // find selected element
int32_t found = -1; int32_t found = -1;
mutex.lock();
for (uint32_t i = 0; i < elements.size(); ++i) { for (uint32_t i = 0; i < elements.size(); ++i) {
if (elements[i]->isStateSet(STATE_SELECTED | STATE_OVER)) { if (elements[i]->isStateSet(STATE_SELECTED | STATE_OVER)) {
found = i; found = i;
break; break;
} }
} }
mutex.unlock();
return found; return found;
} }
@ -156,12 +174,14 @@ void GuiFrame::draw(CVideo *v) {
//Menu_DrawRectangle(0, 0, GetZPosition(), screenwidth,screenheight, &dimColor, false, true); //Menu_DrawRectangle(0, 0, GetZPosition(), screenwidth,screenheight, &dimColor, false, true);
} }
mutex.lock();
//! render appended items next frame but allow stop of render if size is reached //! render appended items next frame but allow stop of render if size is reached
uint32_t size = elements.size(); uint32_t size = elements.size();
for (uint32_t i = 0; i < size && i < elements.size(); ++i) { for (uint32_t i = 0; i < size && i < elements.size(); ++i) {
elements[i]->draw(v); elements[i]->draw(v);
} }
mutex.unlock();
} }
void GuiFrame::updateEffects() { void GuiFrame::updateEffects() {
@ -171,12 +191,14 @@ void GuiFrame::updateEffects() {
GuiElement::updateEffects(); GuiElement::updateEffects();
mutex.lock();
//! render appended items next frame but allow stop of render if size is reached //! render appended items next frame but allow stop of render if size is reached
uint32_t size = elements.size(); uint32_t size = elements.size();
for (uint32_t i = 0; i < size && i < elements.size(); ++i) { for (uint32_t i = 0; i < size && i < elements.size(); ++i) {
elements[i]->updateEffects(); elements[i]->updateEffects();
} }
mutex.unlock();
} }
void GuiFrame::process() { void GuiFrame::process() {
@ -186,12 +208,14 @@ void GuiFrame::process() {
GuiElement::process(); GuiElement::process();
mutex.lock();
//! render appended items next frame but allow stop of render if size is reached //! render appended items next frame but allow stop of render if size is reached
uint32_t size = elements.size(); uint32_t size = elements.size();
for (uint32_t i = 0; i < size && i < elements.size(); ++i) { for (uint32_t i = 0; i < size && i < elements.size(); ++i) {
elements[i]->process(); elements[i]->process();
} }
mutex.unlock();
} }
void GuiFrame::update(GuiController *c) { void GuiFrame::update(GuiController *c) {
@ -199,10 +223,12 @@ void GuiFrame::update(GuiController *c) {
return; return;
} }
mutex.lock();
//! update appended items next frame //! update appended items next frame
uint32_t size = elements.size(); uint32_t size = elements.size();
for (uint32_t i = 0; i < size && i < elements.size(); ++i) { for (uint32_t i = 0; i < size && i < elements.size(); ++i) {
elements[i]->update(c); elements[i]->update(c);
} }
mutex.unlock();
} }