SFML线程不适用于窗口

时间:2015-10-08 20:04:41

标签: multithreading sfml

我的代码很简单:

#include <SFML\Graphics.hpp>

sf::RenderWindow *mainWindow;

void changeMainWindowParameters()
{
    while(mainWindow->isOpen())
    {
        sf::Event event;
        while (mainWindow->pollEvent(event))
        {
            if(event.type == sf::Event::Closed)
            {
                mainWindow->close();
                return;
            }
        }
        mainWindow->clear();
        mainWindow->draw(sf::CircleShape(50.0F, 30));
        mainWindow->display();
    }
}
int main()
{
    mainWindow = new sf::RenderWindow(
            sf::VideoMode(100, 100), "Window");
    changeMainWindowParameters();

}

但是如果我想用线程来做,它就不像前面的例子那样工作:

#include <SFML\Graphics.hpp>

sf::RenderWindow *mainWindow;

void changeMainWindowParameters()
{
    while(mainWindow->isOpen())
    {
        sf::Event event;
        while (mainWindow->pollEvent(event))
        {
            if(event.type == sf::Event::Closed)
            {
                mainWindow->close();
                return;
            }
        }
        mainWindow->clear();
        mainWindow->draw(sf::CircleShape(50.0F, 30));
        mainWindow->display();
    }
}
int main()
{
    mainWindow = new sf::RenderWindow(
            sf::VideoMode(100, 100), "Window");
    sf::Thread th(changeMainWindowParameters);
    th.launch();
    //code
    th.wait();

}

我无法关闭窗口/移动它等。

我希望程序能够做某事(在这个窗口上绘制图像等),这样我就可以关闭/移动这个窗口了。

哪里错了?

1 个答案:

答案 0 :(得分:1)

我解决了这个问题:

#include <SFML\Graphics.hpp>
#include <thread>
#include <iostream>

sf::RenderWindow *mainWindow = nullptr;

void changeMainWindowParameters()
{
    if (mainWindow == nullptr)
        mainWindow = new sf::RenderWindow(sf::VideoMode(100, 100), "Window");
    while(mainWindow->isOpen())
    {
        sf::Event event;
        while (mainWindow->pollEvent(event))
        {
            if(event.type == sf::Event::Closed)
            {
                mainWindow->close();
                return;
            }
        }
        mainWindow->clear();
        mainWindow->draw(sf::CircleShape(50.0F, 30));
        mainWindow->display();
    }
}
int main()
{
    sf::Thread th(changeMainWindowParameters);

    th.launch();
    for(;;)
        std::cout << '.';
    th.wait();

}

我们必须记住,必须在创建窗口的同一线程中调用事件循环(更确切地说,pollEvent或waitEvent函数)。