Wikipeando

Utilizar Metodos de Clase como Thread en Windows

Posteado en Programacion, C++ por Ripper el 4 de February de 2007

Algo que suele suceder en C++ cuando se desarrolla es que aveces se quiere utilizar un metodo de la clase desarrollada como Thread, para esto hay que hacer algunos pasos adicionales, de manera que no provoque ningun error y todo funcione correctamente :)

Veamos un ejemplo, una clase llamada IOCPNetwork (nombre referenciado al método de utilización de sockets en windows)

class IOCPNetwork
{
private:
SOCKET ListenSocket;
/* .. otras variables utiles .. */
public:
IOCPNetwork();
~IOCPNetwork();
void InitWorker();
DWORD WINAPI WorkerThread(LPVOID lpParam);
DWORD WINAPI AcceptThread(LPVOID lpParam);
/* otros metodos de la clase */
};

Para hacer que InitWorker() inicialize WorkerThread como un thread de windows vamos a hacer lo siguiente,
1. Cambiamos la definicion en la clase de

DWORD WINAPI WorkerThread(LPVOID lpParam);
a
static DWORD WINAPI WorkerThread(LPVOID lpParam);

y dentro de InitWorker() haríamos lo siguiente:

void IOCPNetwork::InitWorker()
{
DWORD dwThreadId;
CreateThread(0, 0, WorkerThread, (void *)this, 0, &nThreadID);
}

pero porque le pasamos como parámetro el puntero this ?
sencillo, para luego poder acceder desde nuestro Thread a los métodos de la clase haciendo lo siguiente

DWORD WINAPI WorkerThread(LPVOID lpParam)
{
IOCPNetwork * This = (IOCPNetwork*)lpParam;
This->Metodo();
return 0;
}

Espero que les haya servido de ayuda :)
Saludos!