Autor Wątek: SFML problem z siecią i renderowaniem okna  (Przeczytany 1437 razy)

Offline Dethas

  • Użytkownik

# Kwiecień 03, 2015, 00:10:01
Witam, otóż problem polega na tym że gdy włączę funkcję odbierającą dane z sieci to moje okno zacina się na stałe, nie renderuje się ani nie odbiera zdarzeń. Kod:
int main()
{
Client client;
client.Connect();

Thread Odbieranie( &Client::Recieve, &client );
sf::Mutex mutex;

RenderWindow oknoAplikacji( VideoMode( 300, 300 ), "Client!");
    while( oknoAplikacji.isOpen() )
    {
Event zdarzenie;

Odbieranie.launch();

        while( oknoAplikacji.pollEvent(zdarzenie) )
        {
            if(zdarzenie.type == Event::Closed)
{
client.Disconnect();
Odbieranie.terminate();
                oknoAplikacji.close();
}
if ((zdarzenie.type == sf::Event::KeyPressed) && (zdarzenie.key.code == sf::Keyboard::Escape))
{
client.Disconnect();
Odbieranie.terminate();
                oknoAplikacji.close();
}
        }
oknoAplikacji.clear();
        oknoAplikacji.display();
    }
    return 0;
}

CO zrobić by okno mogło być renderowane i jednocześnie odbierane wiadomości z servera?

Offline Mr. Spam

  • Miłośnik przetworów mięsnych

Offline timus

  • Użytkownik

# Kwiecień 03, 2015, 00:48:46
Nie znam sfml'a ale możliwe, że metoda launch klasy Thread forkuje watek i odpala wskazana fukcje, w takim przypadku przy każdej iteracji petli proces będzie forkowany a to chwile zajmuje. Łatwo jest to sprawdzić/naprawić wystarczy zrobić drugi watek z petla i tam odbierać.

Edit:
W uproszczeniu chodzi mi o cos takiego:
Client client;
Thread Odbieranie;

void drugiWatek()
{
while(1)
{
client.Recieve();
}
}

int main()
{
client.Connect();

Odbieranie = Thread(drugiWatek);
Odbieranie.launch();

RenderWindow oknoAplikacji( VideoMode( 300, 300 ), "Client!");
while( oknoAplikacji.isOpen() )
{
oknoAplikacji.clear();
oknoAplikacji.display();
}
return 0;
}
« Ostatnia zmiana: Kwiecień 03, 2015, 01:08:05 wysłana przez timus »

Offline Dethas

  • Użytkownik

# Kwiecień 03, 2015, 00:58:19
Nie za bardzo rozumiem o co chodzi, poproszę jakiś przykład jak by można było to rozwiązać z drugim wątkiem, a jeśli chodzi o ten mój wątek to bez niego dzieje się to samo gdy po prostu odpalam funkcję recieve().

Offline Cyste

  • Użytkownik

# Kwiecień 03, 2015, 01:56:12

Offline pajadam

  • Użytkownik

# Kwiecień 03, 2015, 02:13:18
Nie podałeś nam właściwie żadnych przydatnych informacji. Podałeś jedynie część kodu źródłowego. Może podałbyś chociaż wersję SFML'a? Ale dobra.

Więc, zacznijmy od tego że popełniłeś bardzo poważny błąd - nie przetestowałeś działania poszczególnych elementów kodu.

Gdybyś to zrobił , dostrzegł byś że: wątek główny ( main ) czeka na zakończenie wątku pobocznego ( Odbieranie) by móc go ponownie uruchomić ( Odbieranie.launch() ). Właśnie dlatego okno się nie aktualizuje, ponieważ czeka na wątek drugi.
Czyli właściwie tak jakby drugiego wątku nie było, aczkolwiek działa to ciut szybciej :D

Pisanie testów to podstawa, pamiętaj :D A jeśli nie potrafisz analizować własnego kodu, to marny twój los :D
Dużo nie bawiłem się wątkami ale myślę że trochę ci pomogłem i naprowadziłem na rozwiązanie problemu, ale i tak Timus podał ci gotowca ;)

Powodzenia :)
« Ostatnia zmiana: Kwiecień 03, 2015, 14:16:15 wysłana przez pajadam »