Questo sito utilizza cookies, anche di terze parti, per mostrare pubblicità e servizi in linea con il tuo account. 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...


Nel mondo ci sono 10 tipi di persone: quelle che capiscono il binario e quelle che non lo capiscono
PM Quote
Avatar
nessuno (Normal User)
Guru^2


Messaggi: 5475
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 ...
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


Nel mondo ci sono 10 tipi di persone: quelle che capiscono il binario e quelle che non lo capiscono
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?


Nel mondo ci sono 10 tipi di persone: quelle che capiscono il binario e quelle che non lo capiscono
PM Quote
Avatar
TheKaneB (Member)
Guru^2


Messaggi: 1787
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.


Software Failure: Guru Meditation
Forum su Informatica, Elettronica, Robotica e Tecnologia: http://www.nonsoloamiga.com
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


Nel mondo ci sono 10 tipi di persone: quelle che capiscono il binario e quelle che non lo capiscono
PM Quote
Avatar
TheKaneB (Member)
Guru^2


Messaggi: 1787
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 ;)


Software Failure: Guru Meditation
Forum su Informatica, Elettronica, Robotica e Tecnologia: http://www.nonsoloamiga.com
PM Quote