| Ver tema anterior :: Ver tema siguiente |
| Autor |
Mensaje |
a3093 Lt


Registrado: 27 May 2004Mensajes: 97Ubicación: Las Palmas de Gran Canaria
|
Publicado: Mar 28 Nov, 2006 10:24 am Asunto: Procesador a tope |
|
|
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 |
|
 |
Cesar C. Salazar Gonzalez Master


Registrado: 01 Oct 2002Mensajes: 2155Ubicación: San Cristóbal de Las Casas, Chiapas
|
Publicado: Mie 29 Nov, 2006 10:06 am Asunto: |
|
|
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 _________________
 |
|
| Volver arriba |
|
 |
a3093 Lt


Registrado: 27 May 2004Mensajes: 97Ubicación: Las Palmas de Gran Canaria
|
Publicado: Jue 30 Nov, 2006 12:41 am Asunto: |
|
|
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 |
|
 |
a3093 Lt


Registrado: 27 May 2004Mensajes: 97Ubicación: Las Palmas de Gran Canaria
|
Publicado: Jue 30 Nov, 2006 2:06 am Asunto: |
|
|
pues no , 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 |
|
 |
a3093 Lt


Registrado: 27 May 2004Mensajes: 97Ubicación: Las Palmas de Gran Canaria
|
Publicado: Mar 05 Dic, 2006 6:09 pm Asunto: |
|
|
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 |
|
 |
|