【问题标题】:SFML Thread does not works for windowSFML 线程不适用于窗口
【发布时间】:2016-01-06 14:50:47
【问题描述】:

我有简单的代码:

#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();

}

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

我想让程序做一些事情(在这个窗口上绘制图像等),所以我可以关闭/移动这个窗口。

哪里错了?

【问题讨论】:

    标签: multithreading sfml


    【解决方案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 函数)必须在创建窗口的同一线程中调用。

    【讨论】:

      猜你喜欢
      • 2014-08-12
      • 2012-12-16
      • 1970-01-01
      • 2020-10-06
      • 1970-01-01
      • 2011-04-24
      • 2012-08-21
      • 1970-01-01
      • 2013-12-11
      相关资源
      最近更新 更多