• 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

VPS Starter Arubacloud
0 głosów
225 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,340 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,340 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,061 wizyt
pytanie zadane 5 lutego 2020 w C# przez kubekszklany Gaduła (3,170 p.)
0 głosów
1 odpowiedź 191 wizyt
pytanie zadane 23 kwietnia 2019 w Java przez PabloMajo Nowicjusz (170 p.)
0 głosów
1 odpowiedź 275 wizyt
pytanie zadane 8 lipca 2018 w C# przez PięćCzySześć Użytkownik (770 p.)

92,453 zapytań

141,262 odpowiedzi

319,088 komentarzy

61,854 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

Akademia Sekuraka 2024 zapewnia dostęp do minimum 15 szkoleń online z bezpieczeństwa IT oraz dostęp także do materiałów z edycji Sekurak Academy z roku 2023!

Przy zakupie możecie skorzystać z kodu: pasja-akademia - użyjcie go w koszyku, a uzyskacie rabat -30% na bilety w wersji "Standard"! Więcej informacji na temat akademii 2024 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!

...