Club Builder - Foros de discusión Club Builder
Foro de C++Builder en español
 
 FAQFAQ   BuscarBuscar   MiembrosMiembros   Grupos de UsuariosGrupos de Usuarios   RegistrarseRegistrarse 
 PerfilPerfil   Entra para ver tus mensajes privadosEntra para ver tus mensajes privados   EntrarEntrar 

Procesador a tope

 
Publicar nuevo tema   Responder al tema    Foros de discusión -> Consultas
Ver tema anterior :: Ver tema siguiente  
Autor Mensaje
Mensaje    Asunto: Procesador a tope Responder citando

Hola, estoy famirializándome con la ejecución de hilos pero el procesador me va a tope cuando se supone que debe estar durmiendo.

Este es el principal
Código:

int main(int argc, char* argv[])
{

    TPing *hiloPing = new TPing(false);
    hiloPing->WaitFor();
   
    return 0;
}


y este el TPing

Código:

__fastcall TPing::TPing(bool CreateSuspended)
    : TThread(CreateSuspended)
{
  Priority        = tpNormal;
  FreeOnTerminate = true;
}

void __fastcall TPing::Execute()
{
    while (!Terminated) {
        printf("hola\n");
        Sleep(10000);
    }
}


Al ejecutarlo el procesador no baja del 100%. ¿Alguna idea del por qué pasa esto?

Graciassssss
Volver arriba
Ver perfil de usuario Enviar mensaje privado Enviar email Visitar sitio web del autor MSN Messenger
Mensaje    Asunto: Responder citando

lo que pasa que dentro de tu While, debes establecer un tipo de llamada como ProcessMessage(), para que pueda leerte los mensajes que haces dentro del windows, para realizar esta operacion, puedes usar un codigo como el siguiente.

Código:
void ProcessMessages(void)
{
    MSG msg;
    while (PeekMessage(&msg, 0, 0, 0, PM_REMOVE))
    {
        TranslateMessage(&msg);
        DispatchMessage(&msg);
    }
}


y en la parte de tu codigo

Código:
void __fastcall TPing::Execute()
{
    while (!Terminated)
    {
        ProcessMessages();
        printf("hola\n");
        Sleep(10000);
    }
}



considero que lo estas ejecutando sobre windows

Saludos
_________________
Cool
Volver arriba
Ver perfil de usuario Enviar mensaje privado Enviar email MSN Messenger
Mensaje    Asunto: Responder citando

Gracias César,

antes de probarlo voy a mirar que hacen esas instrucciones que me has puesto para aprender, y luego te cuento los resultados.

Cuanto más programo en c/c++, más me doy cuenta todo lo que me queda por aprender
Volver arriba
Ver perfil de usuario Enviar mensaje privado Enviar email Visitar sitio web del autor MSN Messenger
Mensaje    Asunto: Responder citando

pues no Sad, no funciona. Sigue el procesador a toda pastilla con el proceso. Es como si estuviera pendiente de que termine el proceso hijo..... una cosa rara.
Volver arriba
Ver perfil de usuario Enviar mensaje privado Enviar email Visitar sitio web del autor MSN Messenger
Mensaje    Asunto: Responder citando

Hola a todos,

al final solucioné el problema del procesador con un apaño pero que funciona. Aquí pongo la solución de lo q hice por si alguien le ocurre lo mismo.

Principal:
Código:

int main(int argc, char* argv[])
{

    TPing *hiloPing = new TPing(false);
    while(!hiloPing->Terminado())
        Sleep(1);

    return 0;
}

El método Terminado() es una función que devuelve 0 si el hilo sigue ejecutándose y 1 si ya terminó. Con el método WaitFor() se dispara el procesador.

El Sleep(1) también es necesario para que el procesador se mantenga a cero.

ping.h
Código:

class TPing : public TThread
{           
private:
    int terminado;
protected:
    void __fastcall Execute();
public:
    __fastcall TPing(bool CreateSuspended);
    int Terminado();
};

Lo nuevo es la variable y método Terminado que me va a indicar cuando la ejecución del hilo se ha terminado.

ping.cpp
Código:

__fastcall TPing::TPing(bool CreateSuspended)
    : TThread(CreateSuspended)
{
  terminado=0;
  Priority        = tpIdle;
  FreeOnTerminate = true;
}

void __fastcall TPing::Execute()
{
    int i=0;
    while (!Terminated) {
       printf("ping %i\n", i++);
        Sleep(1000);
    }
    terminado=1;
}

int TPing::Terminado(){
    return terminado;   
}

Al final del Execute ponemos terminado=1 para indicar que se ha finalizado la ejecución del hilo.

Este ejemplo tampoco es muy práctico porque nunca llega a cambiar el valor de terminado. Pero se pueden hacer una idea de lo que hay que hacer si vuelve a pasar lo mismo.
Volver arriba
Ver perfil de usuario Enviar mensaje privado Enviar email Visitar sitio web del autor MSN Messenger
Mostrar mensajes de anteriores:   
Cambiar a:  
No puedes publicar temas nuevos en este foro
No puedes responder a temas en este foro
No puedes editar tus mensajes en este foro
No puedes borrar tus mensajes en este foro
No puedes votar en las encuestas de este foro


Hosting WordPress Indedmedia desde 3,99 €
© 2002–2026 Club Builder · Funciona con phpBB.