diff --git a/.clang-format b/.clang-format new file mode 100644 index 0000000..d7f0a70 --- /dev/null +++ b/.clang-format @@ -0,0 +1,9 @@ +Language: Cpp +BasedOnStyle: LLVM +IndentWidth: 2 +ColumnLimit: 132 +SortIncludes: true +AlignAfterOpenBracket: DontAlign +AllowShortIfStatementsOnASingleLine: AllIfsAndElse +AllowShortLoopsOnASingleLine: true +# AllowShortNamespacesOnASingleLine: true diff --git a/gui/SFML/Threads/.clang-format b/gui/SFML/Threads/.clang-format new file mode 120000 index 0000000..3260daf --- /dev/null +++ b/gui/SFML/Threads/.clang-format @@ -0,0 +1 @@ +../../../.clang-format \ No newline at end of file diff --git a/gui/SFML/Threads/.gitignore b/gui/SFML/Threads/.gitignore new file mode 100644 index 0000000..53e31a2 --- /dev/null +++ b/gui/SFML/Threads/.gitignore @@ -0,0 +1,3 @@ +# xmake +.xmake/ +build/ diff --git a/gui/SFML/Threads/inc/main.hh b/gui/SFML/Threads/inc/main.hh new file mode 100644 index 0000000..8cbdc9d --- /dev/null +++ b/gui/SFML/Threads/inc/main.hh @@ -0,0 +1,8 @@ +#ifndef MAIN_HPP_ +#define MAIN_HPP_ + +inline bool isRunning = true; +inline float x_pos = 0; +inline float y_pos = 0; + +#endif // #ifndef MAIN_HPP_ diff --git a/gui/SFML/Threads/inc/render.hh b/gui/SFML/Threads/inc/render.hh new file mode 100644 index 0000000..07bfcc7 --- /dev/null +++ b/gui/SFML/Threads/inc/render.hh @@ -0,0 +1,11 @@ +#ifndef RENDER_HPP_ +#define RENDER_HPP_ + +#include +#include +#include +#include + +void renderingThread(sf::RenderWindow *window); + +#endif // #ifndef RENDER_HPP_ diff --git a/gui/SFML/Threads/inc/thread.hh b/gui/SFML/Threads/inc/thread.hh new file mode 100644 index 0000000..6321fa0 --- /dev/null +++ b/gui/SFML/Threads/inc/thread.hh @@ -0,0 +1,8 @@ +#ifndef THREAD_HPP_ +#define THREAD_HPP_ + +#include + +void testThread(const std::string message, const std::chrono::milliseconds duration); + +#endif // #ifndef THREAD_HPP_ diff --git a/gui/SFML/Threads/src/main.cc b/gui/SFML/Threads/src/main.cc new file mode 100644 index 0000000..dfed99d --- /dev/null +++ b/gui/SFML/Threads/src/main.cc @@ -0,0 +1,52 @@ +#include +#include + +#include +#include +#include +#include + +#include "main.hh" +#include "render.hh" +#include "thread.hh" + +#include + +using namespace std::chrono_literals; + +int main(int argc, char const *argv[]) { + XInitThreads(); + sf::RenderWindow window; + window.create(sf::VideoMode(320, 240), "GUI", sf::Style::Default); + window.setActive(false); + window.setFramerateLimit(60); + + std::thread firstThread(testThread, std::string("firstThread while"), 200ms); + std::thread secondThread(testThread, std::string("secondThread while"), 300ms); + + std::thread render(renderingThread, &window); + sf::Event event; + while (window.isOpen()) { + while (window.pollEvent(event)) { + if (event.type == sf::Event::Closed) { + isRunning = false; + window.close(); + } + + /* Обработчик клавиш */ + if (event.type == sf::Event::KeyPressed) { + // Закрывает программу при нажатии Escape + if (event.key.code == sf::Keyboard::Escape) { + isRunning = false; + window.close(); + } + } + } + } + + render.join(); + firstThread.join(); + secondThread.join(); + + return EXIT_SUCCESS; +} diff --git a/gui/SFML/Threads/src/render.cc b/gui/SFML/Threads/src/render.cc new file mode 100644 index 0000000..58b5b57 --- /dev/null +++ b/gui/SFML/Threads/src/render.cc @@ -0,0 +1,22 @@ +#include "render.hh" +#include "main.hh" + +void renderingThread(sf::RenderWindow *window) { + window->setActive(true); + + while (window->isOpen()) { + if (!isRunning) break; + + window->clear(sf::Color(16, 16, 36)); + + sf::CircleShape shape(50.f); + shape.setFillColor(sf::Color(100, 250, 50)); + shape.setPosition({x_pos, y_pos}); + window->draw(shape); + + if (x_pos <= 320) x_pos++; + else x_pos = 0; + + window->display(); + } +} diff --git a/gui/SFML/Threads/src/thread.cc b/gui/SFML/Threads/src/thread.cc new file mode 100644 index 0000000..6caa7e5 --- /dev/null +++ b/gui/SFML/Threads/src/thread.cc @@ -0,0 +1,13 @@ +#include "thread.hh" +#include "main.hh" + +#include + +using namespace std::chrono_literals; + +void testThread(const std::string message, const std::chrono::milliseconds duration) { + while (isRunning) { + std::cout << message << std::endl; + std::this_thread::sleep_for(duration); + } +} diff --git a/gui/SFML/Threads/xmake.lua b/gui/SFML/Threads/xmake.lua new file mode 100644 index 0000000..955c395 --- /dev/null +++ b/gui/SFML/Threads/xmake.lua @@ -0,0 +1,16 @@ +set_project("sfml-threads") +set_languages("cxx17") +add_rules("mode.debug", "mode.release") + +add_includedirs("inc") + +target("gui") + if is_mode("debug") then + set_symbols("debug") + set_optimize("none") + end + + set_kind("binary") + add_syslinks("m", "stdc++", "pthread", "X11") + add_syslinks("sfml-graphics", "sfml-audio", "sfml-window", "sfml-system") + add_files("src/*.cc")