ďťż

Ładny brzuch

Witam, chciałbym przekazać do funkcji

int pthread_create(pthread_t *restrict thread, const pthread_attr_t *restrict attr, void *(*start_routine)(void*), void *restrict arg);

w następujący sposób:

pthread_create(&recv_thread, 0, &recv_thread_func, 0);

wskaźnik do funkcji będącej składową klasy. Oczywiście przy próbie kompilacji otrzymuję stosowny komunikat o braku możliwości przeprowadzenia takiego działania. Próbowałem rzutować, ale tak też się nie da. Stąd moje pytanie: czy mogę przekazać jako parametr tej funkcji wskaźnik do funkcji będącej składową klasy bez czynienia ją statyczną?
Uczynienie jej statyczną to ostateczność, a utworzenie funkcji recv_thread_func poza klasą raczej nie wchodzi w grę.



pthread_create przyjmuje wskaźniki do globalnych funkcji lub statycznych metod. Wskaźniki do metod tworzy się inaczej.

Wywołując metodę musisz wiedzieć na rzecz którego obiektu ją wywołać, a pthread_create tego nie wie ;)

class Client { public: bool receive(int i) { return true; } void send(bool b, float f) { } }; // Warto korzystać z typedef operując na wskaźnikach do funkcji lub metod. typedef bool (Client::*ReceiveFoo)(int); typedef void (Client::*SendFoo)(bool, float); void execute(Client& client, ReceiveFoo receive, SendFoo send) { // Tak wygląda wywołanie funkcji na rzecz obiektu. // Musisz wskazać obiekt na rzecz którego metoda ma zostać wywołana. if ((client.*receive)(1)) { (client.*send)(true, 2.0f); } } int main() { Client client; execute(client, &Client::receive, &Client::send); return 0; }
Użytkownik Kozack edytował ten post 24 lipiec 2008, 09:39

Wywołując metodę musisz wiedzieć na rzecz którego obiektu ją wywołać, a pthread_create tego nie wie.

Jestem tego zupełnie świadom, więc zadałem pytanie, by dowiedzieć się, czy nie można tego jakoś sprytnie obejść ;)
W chwili obecnej wyodrębniłem funkcję poza klasę i poprzez strukturę przekazuje jej potrzebne dane. Wygląda to tak:

void *recv_thread_func(void *arg) { struct __mem { int mem_id; char **mem; } *memory; memory = (__mem*)arg; sembuf semb; semb.sem_num = 1; semb.sem_op = -1; semb.sem_flg = SEM_UNDO; while(1) { semop(memory->mem_id, &semb, 1); printf("- %s\n", *memory->mem); } } void ChatServer::init_message_thread() { struct __mem { int mem_id; char **mem; } arg; arg.mem_id = recv_memory_id; arg.mem = &recv_memory; pthread_t recv_thread; recv_thread_id = pthread_create(&recv_thread, 0, &recv_thread_func, (void*)&arg); pthread_join(recv_thread, 0); }

Strasznie kombinujesz :) Jako parametr do funkcji wątku przekaż całą klasę :)
void ChatServer::init_message_thread() { //... pthread_create(&recv_thread, 0, &recv_thread_func, (void*)this); //... } void* recv_thred_func(void* arg) { ChatServer* server = (ChatServer*)arg; //... wywołanie metody }




Strasznie kombinujesz Jako parametr do funkcji wątku przekaż całą klasę

W sumie dobry pomysł, tak też zrobię :)

  • zanotowane.pl
  • doc.pisz.pl
  • pdf.pisz.pl
  • zsf.htw.pl
  •