• Domingo 15 de Diciembre de 2024, 07:06

Autor Tema:  Multitarea  (Leído 1232 veces)

Rataman

  • Miembro activo
  • **
  • Mensajes: 45
    • Ver Perfil
Multitarea
« en: Miércoles 19 de Mayo de 2004, 14:04 »
0
A ver si alguien puede poner un link con un manual para hacer multitareas en C o C++, creo k se llaman threads o algo asi, pero no encuentro ningun manual k lo explique claramente, solo definiciones d lo que es. Gracias de antemano

nicokiki

  • Miembro MUY activo
  • ***
  • Mensajes: 298
    • Ver Perfil
Re: Multitarea
« Respuesta #1 en: Miércoles 19 de Mayo de 2004, 14:50 »
0
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.ar

Por 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!!!!!!!!!!!

JuanK

  • Miembro de ORO
  • ******
  • Mensajes: 5393
  • Nacionalidad: co
    • Ver Perfil
    • http://juank.io
Re: Multitarea
« Respuesta #2 en: Miércoles 19 de Mayo de 2004, 16:05 »
0
bueno sobre linux puedes usar la pthread.. eninternet hay varios documentos sobre esta y adicionalmente tengo alguna infromacion al respecto..
si este es tu interes comentanos
[size=109]Juan Carlos Ruiz Pacheco
[/size]
Microsoft Technical Evangelist
@JuanKRuiz
http://juank.io