[Ayuda] Hilos - basico

Iniciado por bemone, 20 Junio 2013, 18:35 PM

0 Miembros y 1 Visitante están viendo este tema.

bemone

Buenos dias damas y caballeros.
Necesitaria a alguna alma generosa que me oriente como hacer esto.
Lo unico que necesito es crear un hilo y ejecutar una funcion.
Lo hice de forma global y anda todo bien, el problema viene cuando lo quiero hacer en una clase.

El codigo de la discordia:

Código (cpp) [Seleccionar]
DWORD WINAPI Socket::ThreadFunc(LPVOID){
   recibirOrdenes();
   return 0;
}

void Socket::SubProceso(){
   DWORD dwThreadId;
   CreateThread(NULL, 0, ThreadFunc, 0, 0, &dwThreadId);
}


Error:

Citarerror: argument of type 'DWORD (Socket:: )(void*)' does not match 'DWORD (*)(void*)'|

Me estoy poniendo nervioso por lo cual decidi acudir a ustedes.
Gracias de antemano.
Odio los tipos de variable de Windows.

amchacon

Sencillamente no puedes hacerlo, CreateThread espera una función global (las funciones miembro no son globales porque solo existen dentro de un objeto creado).

Lo mejor que puedes hacer es pasar una referencia a tu clase:

Código (cpp) [Seleccionar]
DWORD WINAPI ThreadFunc(LPVOID* paquete)
{
    paquete->RecibirOrdenes();
    return 0;
}

void Socket::SubProceso()
{
    DWORD dwThreadId;
    CreateThread(NULL, 0, ThreadFunc,this, 0, &dwThreadId);
}
Por favor, no me manden MP con dudas. Usen el foro, gracias.

¡Visita mi programa estrella!

Rar File Missing: Esteganografía en un Rar

bemone

Cita de: amchacon en 20 Junio 2013, 20:06 PM
Sencillamente no puedes hacerlo, CreateThread espera una función global (las funciones miembro no son globales porque solo existen dentro de un objeto creado).

Lo mejor que puedes hacer es pasar una referencia a tu clase:

Código (cpp) [Seleccionar]
DWORD WINAPI ThreadFunc(LPVOID* paquete)
{
    paquete->RecibirOrdenes();
    return 0;
}

void Socket::SubProceso()
{
    DWORD dwThreadId;
    CreateThread(NULL, 0, ThreadFunc,this, 0, &dwThreadId);
}


recibirOrdenes devuelve un tipo int para saber cuando terminar de ejecutar la accion o no. Como lo harias en ese caso? si el parametro "paquete" lo pongo de tipo int no puedo acceder a recibirOrdenes() porque no es un puntero.
Odio los tipos de variable de Windows.

amchacon

Huy perdón se me olvido el casting:

Código (cpp) [Seleccionar]
DWORD WINAPI ThreadFunc(LPVOID* paquete)
{
   Socket* Parametro = (Socket*) paquete
   Parametro->RecibirOrdenes();
   return 0;
}


Y para que se repita simplemente pones un while (Parametro->RecibirOrdenes() != Valor).
Por favor, no me manden MP con dudas. Usen el foro, gracias.

¡Visita mi programa estrella!

Rar File Missing: Esteganografía en un Rar

bemone

Muchas gracias por tu ayuda, todo esto son conceptos nuevos para mi.
Odio los tipos de variable de Windows.