Error creando Thread (CreateThread)

Iniciado por CeroX901, 17 Octubre 2011, 18:32 PM

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

CeroX901

Hola, estoy intentando crear un Thread desde una Clase pero no logro hacerlo ya que me sale un error que dice:



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

Queta

#1
¿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
"Intenta no volverte un hombre de éxito, sino volverte un hombre de valor." Albert Einstein.

CeroX901

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...

Queta

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í.
"Intenta no volverte un hombre de éxito, sino volverte un hombre de valor." Albert Einstein.

CeroX901

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

Espero que para los que tengan el mismo problema les ayude... Salud2! y Gracias! :D

Queta

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.
"Intenta no volverte un hombre de éxito, sino volverte un hombre de valor." Albert Einstein.

Eternal Idol

Muy interesante y simple de implementar el hack la verdad, no lo conocia.
La economía nunca ha sido libre: o la controla el Estado en beneficio del Pueblo o lo hacen los grandes consorcios en perjuicio de éste.
Juan Domingo Perón

CeroX901

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...  ;)