Oppure

Loading
27/03/10 13:53
robrock80
Ma è possibile crearne?

Io ho scritto

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


Ma niente...
aaa
27/03/10 14:04
nessuno
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à.
27/03/10 14:06
robrock80
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
aaa
27/03/10 14:21
robrock80
Ok, sono riuscito a scrivere il puntatore a una funzione membro


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



Ma ora immagino che non sia possibile passarlo alla CreateThread, mi sbaglio?
aaa
27/03/10 15:00
TheKaneB
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.
aaa
27/03/10 15:08
robrock80
... Ho trovato questo:

codeproject.com/KB/winsdk/…

lo stò studiando, ma è veramente complicato
aaa
27/03/10 15:24
TheKaneB
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 ;)
aaa