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

Podawanie metody z referencją (Bądź wskaźnikiem) do konstruktora klasy thread

Mały hosting, OGROMNE możliwości
0 głosów
551 wizyt
pytanie zadane 6 marca 2016 w C i C++ przez Ceki Mądrala (5,310 p.)

Witam, mój problem jakiś czas temu polegał na tym że nie mogłem uzywac referencji w funkcji która trafia do konstruktora klasy thread, tak to wyglądało:

void funkcja(int &zmienna)
thread zadanie(funkcja, zmienna)

To wywalało błąd więc przerobiłem to w oto taki sposób:

void funkcja(int *zmienna)
thread zadanie(funkcja, &zmienna)

No i rzeczywiście to zadziałało:

Potem funkcja funkcja wylądowała w klasie a zmienna zadanie w innej funkcji tej samej klasy.
Błąd tym razem dotyczył tego że zmienna zadanie nie wiedziała gdzie jest funkcja funkcja.
Poczytałem trochę w internecie i znalazłem wzmiankę o tym że w takiej sytuacji trzeba przy podaniu metody do konstruktora klasy thread zadanie dać przedrostek &klasa::

ostatecznie tak to wyglądało:

void klasa::funkcja(int *zmienna)
thread zadanie(&klasa::funkcja, &zmienna)

Jednakże znowu pojawił się błąd:


Próbowałem zamienić wskaźnik w metodzie na referencje, ale błąd dalej wyskakiwał. Co robić?

Pozdrawiam, z góry dziękuję za odpowiedź

5 odpowiedzi

0 głosów
odpowiedź 6 marca 2016 przez Radfler VIP (101,030 p.)
wybrane 6 marca 2016 przez Ceki
 
Najlepsza

Funkcje składowe przyjmują n+1 parametrów, gdzie n to parametry zdefiniowane przez programistę. Ten jeden, pierwszy dodatkowy parametr to wskaźnik this. I to właśnie jego brak powoduje błąd => musisz go przesłać do konstruktora klasy std::thread:

void klasa::funkcja(int* zmienna);

klasa obiekt;
std::thread zadanie(&klasa::funkcja, &obiekt, &zmienna); // Wskaźnik na obiekt (this)

#EDIT Jak tak to wygląda to wątek twórz tak:

void klasa::zrobZadanie() {
  int zmienna;
  thread zadanie(&klasa::funkcja, this, &zmienna);
  zadanie.join();
}

 

komentarz 6 marca 2016 przez Ceki Mądrala (5,310 p.)
Dziękuję, za odpowiedź jednakże dalej wyskakuje ten sam błąd :/
komentarz 6 marca 2016 przez Radfler VIP (101,030 p.)
Pokaż może aktualny kod.
0 głosów
odpowiedź 6 marca 2016 przez Patrycjerz Mędrzec (192,320 p.)
Przecież jeśli funkcja nie jest statyczna, to musisz stworzyć obiekt, aby ją wywołać, na rzecz tego obiektu.
komentarz 6 marca 2016 przez Ceki Mądrala (5,310 p.)
Zmienna klasy thread zadanie jest w innej metodzie tej samej klasy, a nie w main() ;)
komentarz 6 marca 2016 przez Patrycjerz Mędrzec (192,320 p.)

Jeśli tak, to każda metoda danej klasy powinna być bezproblemowo widoczna w obrębie innej metody tej samej klasy.

Znalazłem chyba rozwiązanie problemu: http://forum.4programmers.net/C_i_C++/82078-C++_BuilderWatek_jako_skladowa_klasy - funkcja do wątku musi być globalna, ale w takiej funkcji możesz już wywołać metodę swojego obiektu (zapewne wynika to z problemów z rozpoznaniem obiektu, dla którego jest wywoływana metoda).

0 głosów
odpowiedź 6 marca 2016 przez Ceki Mądrala (5,310 p.)

Może przybliżę wam jak to wygląda:

 

void klasa::funkcja(int *zmienna)
{
//coś
}

void klasa::zrobZadanie()
{
int zmienna;
thread zadanie(&klasa::funkcja, &zmienna);
zadanie.join();
}

 

komentarz 6 marca 2016 przez Radfler VIP (101,030 p.)
Już edytowałem odpowiedź :)
0 głosów
odpowiedź 6 marca 2016 przez jegor377 Stary wyjadacz (13,230 p.)
Co to thread? :)
0 głosów
odpowiedź 6 marca 2016 przez Ceki Mądrala (5,310 p.)
Dzięki wielkie za odpowiedzi, nie zorientowałem, że muszę w funkcji która trafia do konstruktora thread'a zmienić wskaźnik na referencję :D

Podobne pytania

0 głosów
2 odpowiedzi 1,900 wizyt
pytanie zadane 5 lutego 2020 w C# przez kubekszklany Gaduła (3,250 p.)
0 głosów
1 odpowiedź 319 wizyt
pytanie zadane 23 kwietnia 2019 w Java przez PabloMajo Nowicjusz (170 p.)
0 głosów
1 odpowiedź 506 wizyt
pytanie zadane 8 lipca 2018 w C# przez PięćCzySześć Użytkownik (770 p.)

93,718 zapytań

142,631 odpowiedzi

323,263 komentarzy

63,266 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

Twierdza Linux. Bezpieczeństwo dla dociekliwych

Aby uzyskać rabat -10%, użyjcie kodu pasja-linux, wpisując go w specjalne pole w koszyku.

...