• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Zamrażanie okna w trakcie liczenia czasu w SFML.

Object Storage Arubacloud
0 głosów
208 wizyt
pytanie zadane 10 października 2015 w C i C++ przez Damian Kuriata Użytkownik (600 p.)
edycja 10 października 2015 przez Damian Kuriata

Witam, czy to normalne, że podczas odliczania czasu za pomocą klasy Clock okno jest zamrażanie na pewnien okres czasu i nie można nim manipulować tzn. ponownie go otworzyć po zminimalizowaniu, zamknąć, przesunąć i tak dalej? Pomyślałem, że uda mi się rozwiązać ten problem używając wątków, ale mam kolejny problem o treści: "C:\Users\Damian\Desktop\SFML SJLJ\SFML-2.3.1\include/SFML/System/Thread.inl:77:1: error:   initializing argument 2 of 'sf::Thread::Thread(F, A) [with F = void (*)(sf::RenderWindow&); A = sf::RenderWindow]'"

Nie mogę przesyłać obiektów jako argumenty do funkcji, czy o co chodzi?

#include <SFML/Graphics.hpp>
#include <SFML/Window.hpp>
#include <SFML/System.hpp>
using namespace std;
using namespace sf;
void calculateTheTime(RenderWindow& window1)
{
    Clock clock;
    while(clock.getElapsedTime().asSeconds()<5){
        window1.clear();
        window1.display();
        window1.clear(Color::Magenta);
        window1.display();
    }
    window1.close();
}
int main()
{
   RenderWindow window1(VideoMode(600,600,32),"My SFML program");
   Thread thread1(calculateTheTime,window1);
   while(window1.isOpen())
   {
       Event event1;
       while(window1.pollEvent(event1))
       {
            if(event1.type==Event::Closed)// TO ZAWSZE MA BYC!!!!
                window1.close();
       }
       thread1.launch();
   }
    return EXIT_SUCCESS;
}

2 odpowiedzi

+1 głos
odpowiedź 10 października 2015 przez niezalogowany
Problemem jest to, że nie możesz korzystać z okna jednocześnie w dwóch wątkach, bo mogłaby być sytuacja że byłaby rozpocząeta praca na oknie, zmiana wątku znowu edycja okna i powrót do głóengo wątku, w którym byłoby inne zmienione okno, co za tym idzie byłaby rozpoczęta edycja 1 obiektu w dwóch miejscach co jest niedopuszczalne, możliwe że pomogłyby Mutex'y.

O ile dobrze widzę, to twój problem można spokojnie rozwiązać bez korzystaniu z wielu wątków. Możesz powiedzieć co chcesz dokładnie osiągnąć?
komentarz 11 października 2015 przez Damian Kuriata Użytkownik (600 p.)
Poprostu chcę odliczać czas i jednocześnie wykonywać jakieś czynności na oknie np. zmieniać tło, rozmiar, czy zminimalizować.
komentarz 11 października 2015 przez niezalogowany
W takim razie zupełnie ci wystarczy wątek główny, po prostu musisz się przestawić ze stosowania pętli while, na instrukcję warunkową if. @Patrycjerz dość dobrze pokazał samą ideę tego przejścia, więc ja nie będę pisał tego samego
+1 głos
odpowiedź 10 października 2015 przez Patrycjerz Mędrzec (192,320 p.)

Jak wygląda twoja pętla gry?! Dla pętli stałokrokowej ma to wyglądać mniej więcej tak:

sf::RenderWindow window;
sf::Clock clock;
sf::Time time;
while(window.isOpen())
{
	events();
	if(time.asSeconds() > 5)
	{
		update(time);
		time = sf::Time::Zero;
		clock.reset();
	}
	draw();
	time = clock.getElapsedTime();
}

 

komentarz 10 października 2015 przez niezalogowany
Też mi się wydaje, że autorowi raczej o coś takiego chodziłło
komentarz 10 października 2015 przez Patrycjerz Mędrzec (192,320 p.)
Też tak sądzę. Autor chciał zrobić pętlę stałokrokową, ponieważ uniemożliwiał aktualizację gry przez pięc sekund, ale wg mnie takie wykonanie nie jest zbyt dobre (m.in. brak ciągłej obsługi zdarzeń).
komentarz 10 października 2015 przez Patrycjerz Mędrzec (192,320 p.)

Oczywiście jeśli wsadziłby obsługę zdarzeń w warunek:

if(clock.getElapsedTime().asSeconds() < 5)

to praktycznie kod działałby tak samo. Tutaj sytuacja jest względna...

Podobne pytania

0 głosów
0 odpowiedzi 103 wizyt
0 głosów
0 odpowiedzi 100 wizyt
0 głosów
1 odpowiedź 1,407 wizyt

92,632 zapytań

141,498 odpowiedzi

319,872 komentarzy

62,011 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...