En lo personal, yo no consideraría que pasa en un puntero de función que usted está tratando para hacer como muy C++ como. Eso es codificación C en C++
En cambio, envolvería esa cosa en una clase. La gran ventaja es que puedes anular la clase para tener tantos miembros como desees, en lugar de tener que realizar grandes trucos de lanzamiento para obtener tus parámetros todo el tiempo.
El código es un poco largo, así que lo empujé hasta el final. Pero lo que le permite hacer es algo como esto:
class print_some : public basic_thread {
private:
int i;
public:
print_some (int i) : i(i) {};
action_callback() {
std::cout << i << std::endl;
}
}
int main() {
print_some printer (155);
}
Aquí hay un código de ejemplo exerpted de una de nuestras clases que hace esto:
class basic_thread :
{
public:
basic_thread();
protected:
unsigned long m_ThreadId;
virtual void action_callback() {};
// Internal routine used to bridge between OS callback format and
// action_callback. *Must* be static for the OS.
static unsigned long __stdcall self_calling_callback (void *parameter);
}
... y en el .cpp:
unsigned long __stdcall basic_thread::self_calling_callback (void *parameter) {
if (parameter) {
basic_thread * thread = reinterpret_cast<basic_thread *>(parameter);
thread->action_callback();
}
return 0; // The value returned only matters if someone starts calling GetExitCodeThread
// to retrieve it.
}
basic_thread::basic_thread() {
// Start thread.
m_Handle = CreateThread(NULL,
0,
self_calling_callback,
(PVOID)this,
0,
&m_ThreadId);
if(!IsHandleValid())
throw StartException("CreateThread() failed", GetLastError());
}
¿Cuál es exactamente el problema? – Brian