правильная обработка событий в больших проектах с несколькими файлами SDL2 C

#c #oop #sdl-2

#c #ооп #sdl-2

Вопрос:

Это то, с чем я боролся некоторое время, и это, наконец, создало проблему для моей программы. Я не знаю, как обрабатывать события в крупномасштабном проекте с несколькими файлами на SDL2. В настоящее время у меня есть файл событий, в котором есть основной цикл событий SDL2, и у меня есть статические переменные. Например, у меня есть: bool Events::mouseClicked = false; и в цикле событий, если это тот случай, когда он нажат, я устанавливаю для него значение true, а затем false при выпуске. Этот способ работал хорошо до сих пор .. до сих пор, потому что любой файл, которому нужны события, я бы просто включил события.введите h в заголовок другого файла, а затем создайте его экземпляр в заголовке, а затем, если мне нужно будет определить, была ли нажата мышь, я бы просто вызвал if (EVENTS.mouseClicked == true){}... , но сейчас этот метод плохо работает, например, с прокруткой. Если у меня есть куча объектов для рисования на экране, скажем, например, текст. for (int i=0; i < listOfThings.size(); i ){ if (EVENTS.mouseScrolled == true) { listOfThings[i].Change_Pos(x, y EVENTS.scrollVal); } listOfThings[i].Draw_Text(renderer) } Если все эти тексты необходимо перемещать при прокрутке, я сталкиваюсь с ошибками, поскольку они статичны, где, если мышь прокручивается, скажем, во время итерации цикла for по тексту, это может изменить некоторые из них, но не всегда все, особенно если fps падает из-за других процессов. Это не удобный способ структурирования обработки событий. Есть ли какие-либо другие способы, которые позволят убедиться, что этого не произойдет, И могут иметь несколько событий, происходящих одновременно, т.Е. CTRL c или что-то в этом роде.

Комментарии:

1. Помимо очевидного решения (переместить проверку за пределы цикла for), у вас все равно будут некоторые условия гонки. Рассмотрите возможность добавления мьютекса или std::atomic .

2. Извините, я относительно новичок в программировании и C , я не совсем уверен, что это значит.

3. Да, я действительно думал об этом (и на самом деле это сделал), но это был всего лишь пример. Похоже, что этот метод не сработает в долгосрочной перспективе, пытаясь управлять проектом, особенно когда речь идет не только о прокрутке и других событиях, которые влияют на положение текста. мне пришлось бы иметь много циклов for для каждого отдельного условия только из-за этого, что, похоже, поднимает красный флаг для моего проекта.структура кодирования

4. Если вы собираетесь использовать многопоточность, вы должны знать, что такое мьютекс и прочее. Прочитайте документацию .

5. ого. как, черт возьми, мьютекс защищает его, это довольно круто, спасибо