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

Równoległe wykonywanie kodu?

Ostatnio zmodyfikowano 2017-06-11 23:22
Autor Wiadomość
Rainbow
Temat założony przez niniejszego użytkownika
Równoległe wykonywanie kodu?
» 2017-06-10 22:20:12
Nie wiem jak opisać o co mi chodzi, więc użyję przykładu - załóżmy, że piszę kod na grę typu snake, wąż co sekundę się porusza, co za tym idzie, jest dana pętla, w której jest komenda np. "Sleep(1000);". Pętla ta wykonuje się bez przerwy, przynajmniej dopóki się nie przegra. Ale trzeba też założyć, że gracz ma mieć możliwość kliknięcia w każdym momencie strzałki, która zmieni kierunek poruszania się węża. Problem polega na tym, że wymóg wprowadzenia polecenia z klawiatury będzie blokować program, a nawet jeśli się to pominie (np. przez default w switch'u) to gracz ciągle będzie miał możliwość wciśnięcia strzałki tylko co sekundę, a nie cały czas. No i tutaj pojawia się potrzeba równoległego wykonywania kodu odpowiedzialnego za działanie gry i kodu odpowiedzialnego za oczekiwanie aż gracz wciśnie strzałkę (i te kody powinny oczywiście operować na tych samych zmiennych). Istnieje jakiś sposób, żeby coś takiego osiągnąć? A może istnieje jakaś zupełnie inna opcja, która umożliwia rozwiązanie tego typu problemów?
P-162354
Kinexity
» 2017-06-10 22:29:34
Oczywiście, że istnieją takie możliwości - w końcu od czegoś są te procesory wielordzeniowe. W bibliotece standardowej masz następujące narzędzia:
- <atomic> - odpowiada za "bezpieczeństwo" zmiennych
- <condition_variable> - synchronizacja
- <future> - podajże obsługa asynchronicznego dostępu do zmiennych
- <mutex> - priorytetyzacja (obsługa wstrzymywania wykonywania wątków na rzecz jednego itp.)
- <thread> - obsługuje wątki
Generalnie powyższe narzędzia pozwolą ci wykonać większość zadań wielowątkowych.
P-162357
Monika90
» 2017-06-10 23:54:11
Żadnych wątków. Zamiast wywoływać Sleep raz z argumentem 1000 można wywołać 20 razy z argumentem 50 i sprawdzać stan klawiatury za pomocą funkcji kbhit().
P-162361
Rainbow
Temat założony przez niniejszego użytkownika
» 2017-06-11 01:21:17
Monika90, wielkie dzięki za podpowiedź, która nie wymaga ode mnie natychmiastowego uczenia się używania klas, jednak ta opcja podpowiedziana przez Ciebie coś mi nie chce działać (w kodzie ten wąż mimo wciskania strzałek ciągle idzie w dół), udało mi się sprawdzić i coś mi nie łapie tej strzałki...
P-162365
carlosmay
» 2017-06-11 08:39:20
w kodzie ten wąż mimo wciskania strzałek ciągle idzie w dół
Na pewno jest jakiś błąd w kodzie. Gdzie kod?
udało mi się sprawdzić i coś mi nie łapie tej strzałki...
Jak ją łapiesz?
P-162366
Saran
» 2017-06-11 10:56:56
Wydaje mi się, że to już zbacza z oryginalnego tematu.
P-162368
Rainbow
Temat założony przez niniejszego użytkownika
» 2017-06-11 13:46:00
carlosmay, proszę bardzo, oto kod:
C/C++
#include<iostream>
#include<conio.h>
#include<windows.h>
#include<cstdlib>
#include<cstdio>
using namespace std;
void zerowanie( int t[ 20 ][ 20 ] )
{
    for( int i0 = 0; i0 < 20; i0++ ) {
        for( int j0 = 0; j0 < 20; j0++ ) {
            t[ j0 ][ i0 ] = 0;
        }
    }
}
void pozycja( int t[ 20 ][ 20 ], int g[ 4 ] ) {
    for( int i2 = 0; i2 < 20; i2++ ) {
        for( int j2 = 0; j2 < 20; j2++ ) {
            if( t[ j2 ][ i2 ] > 0 ) t[ j2 ][ i2 ] --;
           
        }
    }
    t[ g[ 0 ] ][ g[ 1 ] ] = g[ 3 ];
}
void znak( int t ) {
    HANDLE hOut;
    hOut = GetStdHandle( STD_OUTPUT_HANDLE );
    if( t > 0 ) {
        SetConsoleTextAttribute( hOut, BACKGROUND_BLUE | BACKGROUND_INTENSITY );
        cout << " ";
    }
    if( t == - 1 ) {
        SetConsoleTextAttribute( hOut, BACKGROUND_RED | BACKGROUND_INTENSITY );
        cout << " ";
    }
    SetConsoleTextAttribute( hOut, FOREGROUND_BLUE | FOREGROUND_RED | FOREGROUND_GREEN );
    if( t == 0 ) {
        cout << " ";
    }
}
void wyswietlenie( int t[ 20 ][ 20 ], int g[ 3 ] ) {
    system( "cls" );
    for( int i1 = 0; i1 <= 19; i1++ ) {
        for( int j1 = 0; j1 <= 19; j1++ ) {
            znak( t[ j1 ][ i1 ] );
        }
        cout << endl;
    }
    cout << "Kierunek: " << g[ 2 ] << endl;
    cout << "Wynik: " << g[ 3 ] << endl;
}
void ruch( int t[ 20 ][ 20 ], int g[ 4 ] ) {
    switch( g[ 2 ] ) {
    case 1:
        if( g[ 0 ] < 19 ) g[ 0 ] ++;
        else g[ 0 ] = 0;
       
        break;
    case 2:
        if( g[ 1 ] < 19 ) g[ 1 ] ++;
        else g[ 1 ] = 0;
       
        break;
    case 3:
        if( g[ 0 ] >= 0 ) g[ 0 ] --;
        else g[ 0 ] = 19;
       
        break;
    case 4:
        if( g[ 1 ] >= 0 ) g[ 1 ] --;
        else g[ 1 ] = 19;
       
        break;
    }
}
void kierunek( int g[ 4 ] ) {
    char znak;
    znak = kbhit();
    switch( znak ) {
    case 77:
        g[ 2 ] = 1;
        break;
    case 80:
        g[ 2 ] = 2;
        break;
    case 75:
        g[ 2 ] = 3;
        break;
    case 72:
        g[ 2 ] = 4;
        break;
    }
}
int main()
{
    int t[ 20 ][ 20 ];
    zerowanie( t );
    int g[ 4 ] = { 0, 0, 1, 4 }; //wspolrzedna x, wspolrzedna y, kierunek, wynik
    wyswietlenie( t, g );
    while( 1 == 1 ) {
        for( int l = 0; l < 20; l++ ) {
            kierunek( g );
            Sleep( 50 );
        }
        pozycja( t, g );
        wyswietlenie( t, g );
        ruch( t, g );
    }
    system( "pause" );
    return 0;
}



Saran, niby tak, ale w temacie było zaznaczone pod koniec, że inny sposób rozwiązania tego problemu też może być.
P-162373
carlosmay
» 2017-06-11 13:54:46
» Kurs C++Obsługa klawiatury za pomocą <conio.h> lekcja
Skorzystaj z funkcji getch() od pobieranie kodu znaku strzałki.
P-162374
« 1 » 2
  Strona 1 z 2 Następna strona