Questo sito utilizza cookies solo per scopi di autenticazione sul sito e nient'altro. Nessuna informazione personale viene tracciata. Leggi l'informativa sui cookies.
Username: Password: oppure
C/C++ - Puntatori a funzione membro
Forum - C/C++ - Puntatori a funzione membro

Avatar
robrock80 (Normal User)
Pro


Messaggi: 143
Iscritto: 11/12/2006

Segnala al moderatore
Postato alle 14:53
Sabato, 27/03/2010
Ma è possibile crearne?

Io  ho scritto

Codice sorgente - presumibilmente Plain Text

  1. void(*function)(void *) = NomeClasse::threadedFunction;



Ma niente...

PM Quote
Avatar
nessuno (Normal User)
Guru^2


Messaggi: 6378
Iscritto: 03/01/2010

Segnala al moderatore
Postato alle 15:04
Sabato, 27/03/2010
Non essere sempre generico ... cosa vuoi fare con precisione? Dai maggiori dettagli di tutto quello che pensi di fare e poi si vede come farlo ...


Ricorda che nessuno è obbligato a risponderti e che nessuno è perfetto ...
---
Il grande studioso italiano Bruno de Finetti (uno dei padri fondatori del moderno Calcolo delle probabilità) chiamava il gioco del Lotto Tassa sulla stupidità.
PM Quote
Avatar
robrock80 (Normal User)
Pro


Messaggi: 143
Iscritto: 11/12/2006

Segnala al moderatore
Postato alle 15:06
Sabato, 27/03/2010
Ok... Voglio lanciare un thread con CreateThread, ma quando gli vado a passare una funzione che è una funzione membro di una classe mi dice che non riesce a convertirlo

PM Quote
Avatar
robrock80 (Normal User)
Pro


Messaggi: 143
Iscritto: 11/12/2006

Segnala al moderatore
Postato alle 15:21
Sabato, 27/03/2010
Ok, sono riuscito a scrivere il puntatore a una funzione membro

Codice sorgente - presumibilmente Plain Text

  1. void(NomeClasse::*function)(void *) = &NomeClasse::threadedFunction;



Ma ora immagino che non sia possibile passarlo alla CreateThread, mi sbaglio?

PM Quote
Avatar
TheKaneB (Member)
Guru^2


Messaggi: 1792
Iscritto: 26/06/2009

Segnala al moderatore
Postato alle 16:00
Sabato, 27/03/2010
la CreateThread vuole un puntatore a funzione, che è diverso da un puntatore a membro.

La differenza principale risiede nel fatto che per poter chiamare un membro di una classe, bisogna passargli il puntatore a "this", parametro che il compilatore inserisce in automatico nello stack.

Non c'è verso di trasformare una funzione membro in una normale funzione, a meno che tu non la dichiari "static". In quest'ultimo caso, però, la funzione membro non potrà accedere alle properties della classe che non siano a loro volta dichiarate static (proprio perchè gli manca un "this" da dereferenziare).

Quindi ti conviene usare un passaggio a "due tempi".

- Dichiari una normale funzione (o un membro static) che passerai a CreateThread
- Passi come argomento a questa funzione, l'istanza della classe che ti serve
- Dentro la funzione static, chiami il puntatore a membro usando il parametro che gli è stato passato

E' una procedura un po' macchinosa, ma è l'unica che conosco per mantenere un comportamenteo Object Oriented quando si tratta con puntatori a funzione in stile C.

PM Quote
Avatar
robrock80 (Normal User)
Pro


Messaggi: 143
Iscritto: 11/12/2006

Segnala al moderatore
Postato alle 16:08
Sabato, 27/03/2010
... Ho trovato questo:

http://www.codeproject.com/KB/winsdk/callback_adapter.aspx

lo stò studiando, ma è veramente complicato

PM Quote
Avatar
TheKaneB (Member)
Guru^2


Messaggi: 1792
Iscritto: 26/06/2009

Segnala al moderatore
Postato alle 16:24
Sabato, 27/03/2010
ottimo, non conoscevo win_adapter
In pratica usa la tecnica che ti ho descritto io, ma implementa già dei wrapper (dentro il namespace "win") per le più comuni funzioni di windows in cui occorre usare un puntatore a funzione.
A quanto vedo hanno fatto anche il wrapper per la CreateThread, quindi non ti serve usare la tecnica che ti ho detto sopra, perchè l'hanno già implementata nella libreria al posto tuo ;)

Ciao ;)

PM Quote