Problem' z wątkami

Problem' z wątkami
GO
  • Rejestracja:ponad 10 lat
  • Ostatnio:3 minuty
  • Postów:148
0

Witam. Piszę wielowątkowy program i mam pewien problem. Oto część kodu, w której tworzę wątki:

Kopiuj
    thread inputCheckingThread(&checkInput, &player);
    inputCheckingThread.join();
    thread collisionCheckingThread(&appleCollisionChecking, &apple, &player);
    appleCollisionCheckingThread.join();

Funkcje checkInput() i appleCollsionCheking():

Kopiuj
void checkInput(gameData &data, snake &player)
{
}

void appleCollisionChecking(food &apple, snake &player)
{
    while(1)
    {
//
    }
}

Przy kompilacji wywala mi dwa takie same błędy:
''C:\sciezka\functional:1697: błąd: no type named 'type' in 'class std::result_of<std::_Mem_fn<void (snake::)(gameData, Direction)>(snake, gameData, Direction, bool)>'
typedef typename result_of<_Callable(_Args...)>::type result_type;''
Googlowałem i wiem, że chodzi o referencje w konstruktorach wątków. Próbowałem je usuwać, dodawać, używać std::ref(), itp., ale nic nie zadziałało. Możecie mi pomóc?

edytowany 1x, ostatnio: gogolon
satirev
  • Rejestracja:prawie 14 lat
  • Ostatnio:około 4 lata
0
gogolon napisał(a):
Kopiuj
thread inputCheckingThread(&checkInput, &player);
inputCheckingThread.join();
thread collisionCheckingThread(&appleCollisionChecking, &apple, &player);
appleCollisionCheckingThread.join();

Pomijając to, że ten kod nie jest poprawny to on po prostu nie ma sensu. Tworzysz wątek, joinujesz, tworzysz kolejny wątek i znowu joinujesz. W konsekwencji otrzymujesz sekwencyjny kod z wielkim narzutem na inicjowaniem/niszczenie wątków.

gogolon napisał(a):

Funkcje checkInput() i appleCollsionCheking():

Kopiuj
void checkInput(gameData &data, snake &player)
{
}

void appleCollisionChecking(food &apple, snake &player)
{
    while(1)
    {
//
    }
}

Przy kompilacji wywala mi dwa takie same błędy:
''C:\sciezka\functional:1697: błąd: no type named 'type' in 'class std::result_of<std::_Mem_fn<void (snake::)(gameData, Direction)>(snake, gameData, Direction, bool)>'
typedef typename result_of<_Callable(_Args...)>::type result_type;''
Googlowałem i wiem, że chodzi o referencje w konstruktorach wątków. Próbowałem je usuwać, dodawać, używać std::ref(), itp., ale nic nie zadziałało. Możecie mi pomóc?

Kopiuj
struct foo {
  void bar(const int& buzz) {
    std::cout << buzz;
  }
};

std::thread t(&foo::bar, foo{}, 10);
t.join();
GO
  • Rejestracja:ponad 10 lat
  • Ostatnio:3 minuty
  • Postów:148
0

Po raz pierwszy bawię się wielowątkowością, dlatego kod może nie mieć sensu :D
Dlaczego umieściłeś foo w strukturze? Moje funkcje są zadeklarowane globalnie. Nie za bardzo wiem jak w takim razie osiągnąć to, żeby kilka funkcji wykonywało się jednocześnie, przy czym każda z nich ma w sobie nieskończoną pętlę.

edytowany 2x, ostatnio: gogolon
Pebal
  • Rejestracja:ponad 12 lat
  • Ostatnio:ponad rok
  • Postów:111
1
gogolon napisał(a):
Kopiuj
    thread inputCheckingThread(&checkInput, &player);

Przekazujesz do funkcji jeden parametr zamiast dwóch i w dodatku przekazujesz go przez wskaźniki, więc masz niezgodne typy.
Powinno być:

Kopiuj
    thread inputCheckingThread(checkInput, data, player);

lub:

Kopiuj
    thread inputCheckingThread(checkInput, ref(data), ref(player));
gogolon napisał(a):
Kopiuj
    appleCollisionCheckingThread.join();

Wywołanie tej metody nie ma żadnego sensu jeżeli funkcja wątku nigdy się nie kończy, gdyż ta metoda czeka na zakończenie wątku.

edytowany 2x, ostatnio: Pebal
GO
  • Rejestracja:ponad 10 lat
  • Ostatnio:3 minuty
  • Postów:148
0

Błędy nadal są...
Czy jeśli utworzę obiekt thread, to wątek od razu zacznie się wykonywać?

Pebal
Jakie to są błędy? Tak, wątek startuje automatycznie.
GO
Błędy te same, co opisałem w pierwszym poście.
Pebal
Pokaż wiersz w którym masz błąd.
GO
  • Rejestracja:ponad 10 lat
  • Ostatnio:3 minuty
  • Postów:148
0

Pokaż wiersz w którym masz błąd. - @Pebal

Te błędy nie wskazują na mój kod, tylko na plik functional (będący częścią GNU ISO C++ Library), a dokładnie na te dwie linijki:

Kopiuj
typedef typename result_of<_Callable(_Args...)>::type result_type;

[...]

Kopiuj
M_invoke(_Index_tuple<_Indices...>)
edytowany 6x, ostatnio: gogolon
Pebal
Ok, ale ten błąd jest związany z wywołaniem jakieś funkcji w Twoim kodzie. Jak ten Twój kod wygląda.
GO
Już nieważne, znalazłem ten błąd. Dzięki za pomoc.

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.