Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

[SFML] Wątek chodzi w nieskończoność

Ostatnio zmodyfikowano 2015-08-23 21:10
Autor Wiadomość
kmlkamilek
Temat założony przez niniejszego użytkownika
[SFML] Wątek chodzi w nieskończoność
» 2015-08-23 04:48:16
Przy uruchamianiu mojego programu uruchamiają się dwa wątki. Jeden odczytuje dane (W poniższym kodzie jest to zastąpione windowsowymi Sleep'ami), drugi wyświetla animacje: migający napis "LOADING". Generalnie w obecnym stanie program powinien wyświetlać animację przez 2 sekundy a następnie się wyłączyć, ale wątek z animacją chodzi w nieskończoność. Tak jakby metoda wait() nie mogła zakończyć jego pracy.
Co może być przyczyną?

Editor.h
C/C++
#ifndef Editor_h
#define Editor_h

// Klasa ładująca zasoby i uruchamiająca edytor

#include <SFML/Graphics.hpp>
#include <SFML/Window.hpp>
#include <SFML/System.hpp>

#include <Windows.h>
#include <fstream>

using namespace sf;

class Editor
{
public:
    Editor();
    ~Editor();
   
private:
    void loading();
    void load_resources();
    void load_settings();
   
    void runBuildTool();
   
    Font font_load;
   
    Clock clock;
    Text text;
    short state;
    Uint32 alfa;
};

#endif // Editor_h

Editor.cpp
C/C++
#include "Editor.h"

RenderWindow window( VideoMode( 800, 480, 32 ), "Level Editor", Style::Default );
Mutex mutex;

Editor::Editor()
{
    Thread thread( & Editor::loading, this );
    if( !font_load.loadFromFile( "data/Lfont.f" ) )
    {
        MessageBoxW( NULL, L"Nie można odnaleźć pliku Lfont.f", L"Błąd", MB_ICONERROR | MB_OK );
        return;
    }
   
    text.setCharacterSize( 72 );
    text.setFont( font_load );
    text.setString( "LOADING" );
    text.setPosition( 800 / 2 - text.getGlobalBounds().width / 2, 480 / 2 - text.getGlobalBounds().height / 2 );
    alfa = 255;
   
    state = 0;
   
    thread.launch();
    mutex.lock();
   
    load_resources();
    load_settings();
   
    mutex.unlock();
    thread.wait();
   
    runBuildTool();
}

Editor::~Editor()
{
}

void Editor::loading()
{
    Editor::clock.restart();
    while( true )
    {
        mutex.lock();
        text.setColor( Color( 224, 255, 255, alfa ) );
        if( clock.getElapsedTime().asSeconds() >= 1 / 15 )
        {
            if( state == 0 )
            {
                alfa--;
                if( alfa == 0 )
                     state = 1;
               
            }
            if( state == 1 )
            {
                alfa++;
                if( alfa == 255 )
                     state = 0;
               
            }
            clock.restart();
        }
        window.clear( Color::Black );
        window.draw( text );
        window.display();
        mutex.unlock();
    }
}

void Editor::load_resources()
{
    Sleep( 1000 );
    return;
}

void Editor::load_settings()
{
    Sleep( 1000 );
    return;
}

void Editor::runBuildTool()
{
    return;
}

main.cpp
C/C++
#include "Editor.h"

int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow )
{
    Editor editor;
    return 0;
}
P-136766
DejaVu
» 2015-08-23 08:25:00
Zakładasz mutexa zarówno przed wywołaniem metod jak i przy wywołaniu threada.

/edit:
Przy okazji - polecam Ci używać:
C/C++
mutable std::mutex m_cs; // member klasy

// scoped lock mutexa w metodach wymagających bezpiecznego dostępu do danych
std::lock_guard < std::mutex > lock( m_cs );
P-136767
Monika90
» 2015-08-23 09:29:38
Chodzi w nieskończoność, bo masz tam pętlę nieskończoną while (true) { /*...*/ }
P-136768
kmlkamilek
Temat założony przez niniejszego użytkownika
» 2015-08-23 20:51:29
Sądziłem że metoda wait(), będzie w stanie zatrzymać tą pętle.
P-136804
DejaVu
» 2015-08-23 21:10:53
Wait czeka na zakończenie wątku. Wątek się nie kończy = wait nie puszcza wykonywania kodu dalej.
P-136805
« 1 »
  Strona 1 z 1