Hola!!!
Te recomiendo esta pagina (siempre recomiendo la misma, asi q se podria poner en links de paginas amigas, no se, se me ocurre, es muy buena):
www.recursosprog.com.arPor otro lado, el año pasado tuve (con otra persona) q hacer una clase q encapsule las threads, asi q ahi va: (la clase es basica, con un metodo y nada mas, y encapsula los sockets tambien, aunque estos estan encapsulados tambien en otro lado, .......bueno, no se fijate)
// Comienzo de archivo
#ifndef __THREADS_H__
#define __THREADS_H__
#include <stdio.h>
#include <iostream.h>
//#include "Elementos.h"
#include "CSocket.h"
#ifdef _WINDOWS_
#undef _WINDOWS_
#endif
#include "cPlanta.h"
//#include "elementos.h"
/****************************************************************************************/
/* Clase CThread
/****************************************************************************************/
class CThread {
protected:
void* Info; //Contiene la información que necesita la Thread.
HANDLE hThread; //handle de la Thread.
DWORD IDThread;
virtual void Correr()=0; //Función que se sobrecargará en cada clase que herede
//de CThread.
//En Correr() es donde irá el código propio de la Thread.
static DWORD WINAPI Funcion(void* T);
public:
CThread(){};
virtual ~CThread() {
//vacia
};
void EmpezarThread(); //Con esta función se inicializará un Thread.
};
/********************************************************************************************/
void CThread::EmpezarThread()
{
hThread = CreateThread(NULL, 0, CThread::Funcion, (LPVOID) this, 0, &IDThread);
// creo el thread ejecutando la funcion estatica PuntoEntrada
}
/********************************************************************************************/
DWORD WINAPI CThread::Funcion(void* T)
{
((CThread*)T)->Correr(); //ejecuta el metodo Run, del objeto Thread con lo que puede
//utilizar los atributos de la clase
delete ((CThread*)T); //al finalizar el Thread elimina el objeto Thread
return 0;
}
/********************************************************************************************/
/******************************************************************************************
Clase CThreadCliente
/****************************************************************************************/
class CThreadCliente:public CThread{
protected:
virtual void Correr(); //Función que se sobrecargará la de la clase ancestro CThread.
//En Correr() es donde irá el código propio de la Thread.
static DWORD WINAPI Funcion(void* T);
public:
CThreadCliente()
{
};
virtual ~CThreadCliente()
{
//vacia
};
void EmpezarThread(); //Con esta función se inicializará un Thread.
};
/********************************************************************************************/
void CThreadCliente::Correr()
{
CSocketCom SockCom;
SockCom.Inicializar(); //inicializa las comunicaciones
TIp IpDestino;
CSocket Sock;
IpDestino.a=127;
IpDestino.b=0;
IpDestino.c=0;
IpDestino.d=1;
Sock.Conectar(IpDestino,6000); //se conecta con el servidor local en el puerto 6000
//cout<<"conectado al servidor..."<<endl;
char* Rta=new(char[100]);
while (strcmp(Rta,"¡<1,0>!\0")!=0) //corta cuando el color es 0
{
Sock.RecibirTodo(Rta,100); //recibe lo que mande el servidor
//si el servidor no manda se queda esperando
//cout<<"el servidor dijo: "<<Rta<<endl;
//aca haces lo que queres con el dato que recibis
}
Sock.Cerrar();
SockCom.Terminar();
}
/********************************************************************************************/
void CThreadCliente::EmpezarThread()
{
hThread = CreateThread(NULL, 0, CThread::Funcion, (LPVOID)this, 0, &IDThread);
// creo el thread ejecutando la funcion estatica PuntoEntrada
}
/********************************************************************************************/
DWORD WINAPI CThreadCliente::Funcion(void* T)
{
((CThreadCliente*)T)->Correr(); //ejecuta el metodo Run, del objeto Thread con lo que puede
//utilizar los atributos de la clase
delete ((CThreadCliente*)T); //al finalizar el Thread elimina el objeto Thread
return 0;
}
/********************************************************************************************/
/********************************************************************************************/
/******************************************************************************************
Clase CThreadServidor
/****************************************************************************************/
class CThreadServidor:public CThread{
protected:
CSocket Sock;
virtual void Correr(); //Función que se sobrecargará la de la clase ancestro CThread.
//En Correr() es donde irá el código propio de la Thread.
public:
CThreadServidor()
{
};
virtual ~CThreadServidor()
{
//vacia
};
// void EmpezarThread(); //Con esta función se inicializará un Thread.
void EstablecerDialogo(void* Puntero); //se encarga de dialogar con el cliente
//liberando el socket de escucha para
//que escuche a algun otro castea el puntero
// a void como un CSocket
};
/********************************************************************************************/
void CThreadServidor::Correr()
{
//El servidor, deberá iniciar una lectura en el socket, esperando recibir información:
int a;
char* Cadena;
Cadena=new (char[100]);
CString Nombre;
cPlanta Planta;
strcpy(Cadena,"¡<3,4>!\0");
Sock.EnviarTodo(Cadena,strlen(Cadena));
cin>>a;
// Planta.ToCliente(Sock);
}
/********************************************************************************************/
void CThreadServidor::EstablecerDialogo(void* Puntero)
{
Sock=*(CSocket*)Puntero;
this->EmpezarThread();
}
/********************************************************************************************/
#endif
Salu2!!!!!!!!!!!