Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: bemone en 20 Junio 2013, 18:35 pm



Título: [Ayuda] Hilos - basico
Publicado por: bemone en 20 Junio 2013, 18:35 pm
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
  1. DWORD WINAPI Socket::ThreadFunc(LPVOID){
  2.    recibirOrdenes();
  3.    return 0;
  4. }
  5.  
  6. void Socket::SubProceso(){
  7.    DWORD dwThreadId;
  8.    CreateThread(NULL, 0, ThreadFunc, 0, 0, &dwThreadId);
  9. }

Error:

Citar
error: 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.


Título: Re: [Ayuda] Hilos - basico
Publicado por: 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
  1. DWORD WINAPI ThreadFunc(LPVOID* paquete)
  2. {
  3.    paquete->RecibirOrdenes();
  4.    return 0;
  5. }
  6.  
  7. void Socket::SubProceso()
  8. {
  9.    DWORD dwThreadId;
  10.    CreateThread(NULL, 0, ThreadFunc,this, 0, &dwThreadId);
  11. }


Título: Re: [Ayuda] Hilos - basico
Publicado por: bemone en 20 Junio 2013, 20:36 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
  1. DWORD WINAPI ThreadFunc(LPVOID* paquete)
  2. {
  3.    paquete->RecibirOrdenes();
  4.    return 0;
  5. }
  6.  
  7. void Socket::SubProceso()
  8. {
  9.    DWORD dwThreadId;
  10.    CreateThread(NULL, 0, ThreadFunc,this, 0, &dwThreadId);
  11. }

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.


Título: Re: [Ayuda] Hilos - basico
Publicado por: amchacon en 20 Junio 2013, 20:39 pm
Huy perdón se me olvido el casting:

Código
  1. DWORD WINAPI ThreadFunc(LPVOID* paquete)
  2. {
  3.   Socket* Parametro = (Socket*) paquete
  4.   Parametro->RecibirOrdenes();
  5.   return 0;
  6. }

Y para que se repita simplemente pones un while (Parametro->RecibirOrdenes() != Valor).


Título: Re: [Ayuda] Hilos - basico
Publicado por: bemone en 20 Junio 2013, 20:55 pm
Muchas gracias por tu ayuda, todo esto son conceptos nuevos para mi.