SFML community forums

Help => Graphics => Topic started by: Wander on September 09, 2010, 04:32:44 am

Title: Thread Background Display
Post by: Wander on September 09, 2010, 04:32:44 am
I've been trying to get a background picture to display inside my secondary window in my secondary thread. It won't display anything when I move the file loading into main(), but if I put the file loading into my thread I get the void conversion error. I've tried changing the void to an int, but it won't accept that.

Code: [Select]
#include <iostream>
#include <SFML/Graphics.hpp>
#include <SFML/System.hpp>
#include <SFML/Audio.hpp>

using std::string;
using std::ios;
using std::ofstream;
using std::ifstream;

using std::cin;
using std::cout;
using std::endl;

void extraWindow(void *UserData)
{
    sf::Image BackImage2;
    if (!BackImage2.LoadFromFile("Images/Fire.bmp"))
        return EXIT_FAILURE;
    sf::Sprite BackG2(BackImage2);

    sf::RenderWindow App2(sf::VideoMode(1280, 720, 32), "Laz's Interactive Map :: The Wrath... :: PvP Created");

    sf::Vector2f CenterBack(960, 540);
    sf::Vector2f HalfBack(480, 270);
    sf::View BackgroundTh(CenterBack, HalfBack);
    BackgroundTh.Zoom(0.5f);

    while (App2.IsOpened())
    {
        sf::Event ThreadEvent;
        while (App2.GetEvent(ThreadEvent))
        {
            // Close window : exit
            if (ThreadEvent.Type == sf::Event::Closed)
                App2.Close();

            // Press escape : exit
            if ((ThreadEvent.Type == sf::Event::KeyPressed) && (ThreadEvent.Key.Code == sf::Key::Escape))
                App2.Close();
        }

        App2.SetView(BackgroundTh);
            App2.Draw(BackG2);

    }
}



int main()
{
    sf::RenderWindow App(sf::VideoMode::GetMode(0), "Laz's Interactive Map :: The Wrath... :: PvP Created");

    //Thread Stuff
    bool thread = false;
    sf::Thread Window(extraWindow);

    // Main loop
    while (App.IsOpened())
    {
        // Event loop
        sf::Event Event;
        while (App.GetEvent(Event))
        {
            if ((Event.Type == sf::Event::KeyPressed) && (Event.Key.Code == sf::Key::F2)) {
                thread = true;
                Window.Launch();
            }

            // Close window : exit
            if (Event.Type == sf::Event::Closed)
                App.Close();

            // Press escape : exit
            if ((Event.Type == sf::Event::KeyPressed) && (Event.Key.Code == sf::Key::Escape))
                App.Close();

        }
    }

            App.Display();

    return 0;
}


This code is very watered down from my original. It recreates the same problem though.
Title: Thread Background Display
Post by: Spodi on September 09, 2010, 08:41:18 am
I have never used SFML's threading, but from what I can see from the docs, don't you need to call Thread.Launch() to actually start the thread?
Title: Re: Thread Background Display
Post by: Mindiell on September 09, 2010, 09:06:01 am
The
Code: [Select]
thread = true;
Window.Launch();
is doing it ;)

I think maybe you can use a App2.Display(), no ?
Title: Thread Background Display
Post by: Wander on September 09, 2010, 02:56:35 pm
WOW! How could I forget the App2.Display(). I feel like a total moron.

But I don't how this messes it up:
Code: [Select]
thread = true;
Window.Launch();
Title: Thread Background Display
Post by: Mindiell on September 10, 2010, 08:43:32 am
I was just answering to Spodi, who was asking to launch the Thread ;)
Title: Thread Background Display
Post by: Spodi on September 10, 2010, 09:18:10 am
What can I say, I suck at reading code that isn't color-coded. IDEs have spoiled me. :P