Форум программистов, компьютерный форум, киберфорум
SFML
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
81 / 25 / 19
Регистрация: 27.10.2014
Сообщений: 420
1

Thread и window SFML

24.09.2015, 00:40. Показов 1453. Ответов 0
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
В попытках изучить многопоточность в sfml написал небольшой код чтобы разобраться что к чему.
Main.h
Кликните здесь для просмотра всего текста
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
using namespace mcl;
using namespace std;
 
class Main
{
private:
    sf::ContextSettings settings;   
    sf::Clock clock;
    sf::RenderWindow window;
    sf::Event event;
    sf::Mutex mut;
    float _time;
 
    Button *but1;
public:
    Main();
    void PlayMain();
    void THREAD_Draw();
    void THREAD_Event();
};


Main.cpp
Кликните здесь для просмотра всего текста
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
Main::Main()
{
    settings.antialiasingLevel = 8;
    window.create(sf::VideoMode(1600, 900), "SFML works!"); 
    _time = 0;
    PlayMain();
}
 
void Main::PlayMain()
{
    but1 = new Button;
    sf::Thread drowThread(&Main::THREAD_Draw, this);
    sf::Thread eventThread(&Main::THREAD_Event, this);
 
    while (window.isOpen())
    {       
        _time = clock.getElapsedTime().asMicroseconds();
        _time /= 800;
        clock.restart();
        
        window.setActive(false);
        eventThread.launch();
        eventThread.wait();
        
        window.clear(sf::Color::White);
 
        window.setActive(false);        
        drowThread.launch();
        drowThread.wait();      
        window.display();
    }
}
 
void Main::THREAD_Draw()
{
    (*but1).renderButton(window);
    window.setActive(false);    
}
 
void Main::THREAD_Event()
{
    while (window.pollEvent(event))
    {
        if (event.type == sf::Event::Closed)
            window.close();
    }
}


Button - мой небольшой класс кнопки. На форуме http://en.sfml-dev.org прочитал что перед другими потоками следует делать вот так window.setActive(false);
В моем случае у меня получилась отрисовать кнопку в потоке, она работает. Дальше необъяснимые мигания с черного на белый и обратно, при работе программы. Ну и работа с формой тоже не пашет. Помогите разобраться, уже 3 часа сижу, перепробовал, перечитал, а выхода не нашел(

Добавлено через 3 минуты
Походу где-то тут я ошибся...
Кликните здесь для просмотра всего текста
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
namespace mcl
{
    class Button
    {
    private:
        float x, y, width, height;
        sf::RectangleShape rectangle;
        sf::Text caption;
        sf::Font mainFont;
 
    public:
        Button()
        {
            y = x = 150;
            width = 120;
            height = 50;
            rectangle.setSize(sf::Vector2f(width, height));
            rectangle.setOrigin(sf::Vector2f(width / 2, height / 2));
            rectangle.setPosition(sf::Vector2f(x, y));
            rectangle.setFillColor(sf::Color::Green);
 
            mainFont.loadFromFile("arial.ttf");
            caption.setFont(mainFont);
            caption.setString("Caption");
            caption.setColor(sf::Color::Black);
            caption.setOrigin(sf::Vector2f(caption.getLocalBounds().width / 2, caption.getLocalBounds().height / 2));
            caption.setPosition(rectangle.getPosition());
        }       
 
        void operation(sf::RenderWindow &window)
        {
            sf::Vector2i pixPosCursor = sf::Mouse::getPosition(window);
            sf::Vector2f posCoursor = window.mapPixelToCoords(pixPosCursor);
 
            if (rectangle.getGlobalBounds().contains(posCoursor.x, posCoursor.y))
            {
                if (sf::Mouse::isButtonPressed(sf::Mouse::Left))
                    rectangle.setFillColor(sf::Color::Red);
                else
                    rectangle.setFillColor(sf::Color::Blue);
            }
            window.draw(rectangle);
            rectangle.setFillColor(sf::Color::Green);
        }
 
        void renderButton(sf::RenderWindow &window)
        {
            operation(window);
            window.draw(caption);           
            window.display();        - тут?
        }
    };
}
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
24.09.2015, 00:40
Ответы с готовыми решениями:

При распаковке SFML жалуется на одинаковые файлы Window.hpp
При попытке распаковать библиотеки SFML, находящиеся в ZIP архиве, жалуется на одинаковые файлы...

SFML в C::B пытается что-то найти в D:\sfml-release\ которого нет
Добрый день, вторые сутки пытаюсь подключить SFML библиотеку к C::B. При подключении по мануалу с...

D:\C++ Projekts\SFML\main.cpp [Error] SFML\Graphics.hpp: No such file or directory
Пытаюсь начать кодить на библиотеке SFML но при компиляции пучтого проэкта выдает ...

Создание релиза exe файла SFML C++ на VS 2017 (не удается открыть входной файл "sfml-graphics-s.lib")
не могу собрать решение релиз версии, не пойму что я делаю не так постоянно выдает ошибку 1>LINK...

0
24.09.2015, 00:40
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
24.09.2015, 00:40
Помогаю со студенческими работами здесь

Ошибка: CMake Error at deps/SFML/src/SFML/Window/CMakeLists.txt:106 (message): Xrandr library not found
Собсна, решил собрать библиотеку , столкнулся с непонятками, но потом дошло что не так, начал...

Вызов Window.ShowDialog() срабатывает как Window.Show(), т.е. я могу нажимать на другие окна
Здравствуйте, уважаемые форумчане. Столкнулся с проблемой. У меня есть окно, которое выполняет...

Window является свойством глобального объекта Window
если объект window является свойством глобального объекта Window, то почему запись: Window.window...

Почему в Opera v12.0 координаты окна браузера относительно экрана window.screenX или window.screenY выдает 0?
Здравствуйте, подскажите пожалуйста почему в Opera v 12.0, координаты окна браузера относительно...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
1
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru