[SFML] Wątek chodzi w nieskończoność
Ostatnio zmodyfikowano 2015-08-23 21:10
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 #ifndef Editor_h #define Editor_h
#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.cpp #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 #include "Editor.h"
int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow ) { Editor editor; return 0; }
|
|
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ć: mutable std::mutex m_cs;
std::lock_guard < std::mutex > lock( m_cs );
|
|
Monika90 |
» 2015-08-23 09:29:38 Chodzi w nieskończoność, bo masz tam pętlę nieskończoną while (true) { /*...*/ }
|
|
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. |
|
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. |
|
« 1 » |