Piszę taki programik i utknąłem przy tworzeniu nowego wątku. Wszystko jest pięknie jeśli wywołuje funkcję, sprawa się natomiast komplikuje jeśli chce wywołać metodę.
Zamiast „->” powinno być „::”, powinno zadziałać.
Tak poza tematem, gdzie podajesz jakiś obiekt typu MagicznaKlasa, bo to tak na niczym się nie wywoła, chyba, że statyczna?
To nie jest metoda statyczna i raczej bardzo ciężko będzie ją przerobić na statyczną. Spróbowałem tak zrobić jak napisałeś, ale nie działa, zresztą spodziewałem się tego.
//...
class MagicznaKlasa {
public:
void *MagicznaMetoda (void*){
// operacje polegające na odczytywaniu wartość zmiennych przetworzeniu ich i wysłaniu ich do innego komutera
}
};
int main (int argc, char *argv[]) {
//...
MagicznaKlasa *MojaMagicznaKlasa = new MagicznaKlasa(argumenty);
for (; ;) {
//...
MojaMagicznaKlasa->AkceptujNowego();
pthread_create(&thread_id , NULL, MojaMagicznaKlasa->MagicznaMetoda,NULL); // Tutaj jest błąd
//...
}
//..
}
Zrobiłem sobie funkcję pthread_create, której działanie jest podobne do oryginalnej, tzn. wywołuje podaną jej funkcję z argumentem podanym na samym końcu. Kod sobie powininien przerobić.
@grum:
Funkcja pthread_create oczekuje wskaźnika na *funkcję*. Możesz więc przekazać tam tylko i wyłącznie funkcję (ew. metodę statyczną). Wskaźnik na metodę nie ma wiele wspólnego ze wskaźnikiem na funkcję (może tylko pod względem implementacyjnym). Aby wywołać metodę ze wskaźnika na metodę potrzebujesz obiektu, co w ogóle dyskwalifikuje jego użycie w pthread_create.
Rozwiązanie: pthread_create przyjmuje jako ostatni argument wskaźnik na void (w nomenklaturze C jest to tzw. wskaźnik na wszystko). Zrzutuj wskaźnik na obiekt klasy MagicznaKlasa do void* (reinterpret_cast<void*> (...)) i daj jako ostatni argument pthread_create. Zamiast MagicznaMetoda, wstaw jakąś zwykłą funkcję, która zrzutuje void* z powrotem na MagicznaKlasa* i wywoła odpowiednią metodę. Prościej: