Test Foro de elhacker.net SMF 2.1

Programación => Programación C/C++ => Mensaje iniciado por: CeroX901 en 17 Octubre 2011, 18:32 PM

Título: Error creando Thread (CreateThread)
Publicado por: CeroX901 en 17 Octubre 2011, 18:32 PM
Hola, estoy intentando crear un Thread desde una Clase pero no logro hacerlo ya que me sale un error que dice:

(http://freakbox.co.cc/img/error.jpg)

previamente tengo definida la funcion en private: dentro de la clase:

Código (cpp) [Seleccionar]
DWORD WINAPI Thread_Listen(LPVOID lpParam);

y claramente el método usado está definido de esta manera:

Código (cpp) [Seleccionar]
DWORD WINAPI S_Server::Thread_Listen(LPVOID lpParam) {
do {
cl_[0] = accept(l_, NULL, NULL);
if (cl_[0] == INVALID_SOCKET) {
printf("Error_ACCEPT::%ld\n", WSAGetLastError());
}
noClients++;
} while (true);
    return 0;
}


Cuando intento compilar me sale lo siguiente:

Citarerror C3867: 'S_Server::Thread_Listen': falta la lista de argumentos de la llamada a la función; utilice '&S_Server::Thread_Listen' para crear un puntero al miembro

PD: Trabajo bajo Visual Studio 2010 Professional

Espero que me ayuden... Salud2  ;D
Título: Re: Error creando Thread (CreateThread)
Publicado por: Queta en 17 Octubre 2011, 19:00 PM
¿Y por qué no pruebas a hacer lo que te dice el error?

En cualquier caso, sería mejor que depurases.

http://msdn.microsoft.com/en-us/library/b0x1aatf.aspx (http://msdn.microsoft.com/en-us/library/b0x1aatf.aspx)
Título: Re: Error creando Thread (CreateThread)
Publicado por: CeroX901 en 17 Octubre 2011, 19:56 PM
Intenté con la siguiente linea:

Código (cpp) [Seleccionar]
HANDLE hThread = CreateThread(NULL, 0, &S_Server::Thread_Listen, NULL, 0, &dwThreadId);

Me aparece el siguiente error:

Citarerror C2664: 'CreateThread' : no se puede convertir el parámetro 3 de 'DWORD (__stdcall S_Server::* )(LPVOID)' a 'LPTHREAD_START_ROUTINE'

Sigo con la duda...
Título: Re: Error creando Thread (CreateThread)
Publicado por: Queta en 17 Octubre 2011, 20:58 PM
Pues en teoría, tu primer código, debería funcionar.

Intenta depurar, repito; además que no tenemos suficiente código y puedes probar de solucionarlo con las opciones que vienen en la página que te dí.
Título: Re: Error creando Thread (CreateThread)
Publicado por: CeroX901 en 17 Octubre 2011, 21:07 PM
Logré solucionarlo de la siguiente manera   :rolleyes:

Arriba en private: lo modifiqué así:

Código (cpp) [Seleccionar]
DWORD __stdcall Thread_Listen();

Cuando crea el proceso lo arreglé de esta manera:

Código (cpp) [Seleccionar]
DWORD ThreadId;
DWORD (__stdcall S_Server::*pmfnMember)() = &S_Server::Thread_Listen;
HANDLE hthread=CreateThread(NULL, 0, * (LPTHREAD_START_ROUTINE *) &pmfnMember, this, 0, &ThreadId);


y el método donde ejecuta el código quedó así:

Código (cpp) [Seleccionar]
DWORD S_Server::Thread_Listen() {
do {
cl_[0] = accept(l_, NULL, NULL);
if (cl_[0] == INVALID_SOCKET) {
printf("Error_ACCEPT::%ld\n", WSAGetLastError());
}
noClients++;
} while (true);
    return 0;
}


Me sirvió de ayuda la siguiente pagina: http://www.pocketpcjunkies.com/Uwe/Forum.aspx/wince-vc/2935/Threads-on-class (http://www.pocketpcjunkies.com/Uwe/Forum.aspx/wince-vc/2935/Threads-on-class)

Espero que para los que tengan el mismo problema les ayude... Salud2! y Gracias! :D
Título: Re: Error creando Thread (CreateThread)
Publicado por: Queta en 17 Octubre 2011, 21:40 PM
Cita de: CeroX901 en 17 Octubre 2011, 21:07 PM
Logré solucionarlo de la siguiente manera   :rolleyes:

Arriba en private: lo modifiqué así:

Código (cpp) [Seleccionar]
DWORD __stdcall Thread_Listen();

__stdcall es lo mismo que WINAPI. Está declarada en WinDef.h:

Código (cpp) [Seleccionar]
#define WINAPI __stdcall

Enhorabuena por haberlo solucionado :D.
Título: Re: Error creando Thread (CreateThread)
Publicado por: Eternal Idol en 17 Octubre 2011, 23:19 PM
Muy interesante y simple de implementar el hack la verdad, no lo conocia.
Título: Re: Error creando Thread (CreateThread)
Publicado por: CeroX901 en 18 Octubre 2011, 01:03 AM
Cita de: Queta en 17 Octubre 2011, 21:40 PM
__stdcall es lo mismo que WINAPI. Está declarada en WinDef.h:

Código (cpp) [Seleccionar]
#define WINAPI __stdcall

Enhorabuena por haberlo solucionado :D.

Si me di cuenta... Gracias...  ;)