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:
DWORD WINAPI Thread_Listen(LPVOID lpParam);
y claramente el método usado está definido de esta manera:
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
¿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)
Intenté con la siguiente linea:
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...
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í.
Logré solucionarlo de la siguiente manera :rolleyes:
Arriba en private: lo modifiqué así:
DWORD __stdcall Thread_Listen();
Cuando crea el proceso lo arreglé de esta manera:
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í:
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
Cita de: CeroX901 en 17 Octubre 2011, 21:07 PM
Logré solucionarlo de la siguiente manera :rolleyes:
Arriba en private: lo modifiqué así:
DWORD __stdcall Thread_Listen();
__stdcall es lo mismo que
WINAPI. Está declarada en
WinDef.h:
#define WINAPI __stdcall
Enhorabuena por haberlo solucionado :D.
Muy interesante y simple de implementar el hack la verdad, no lo conocia.
Cita de: Queta en 17 Octubre 2011, 21:40 PM
__stdcall es lo mismo que WINAPI. Está declarada en WinDef.h:
#define WINAPI __stdcall
Enhorabuena por haberlo solucionado :D.
Si me di cuenta... Gracias... ;)