PDA

Ver la Versión Completa : Crear un hilo TImage


grandmasterdari
10-04-2008, 02:23:07
¿Como puedo hacer para crear un componente TImage Hilo?

jachguate
10-04-2008, 02:53:25
¿qué es un componente TImage Hilo?
:confused: :confused:

grandmasterdari
10-04-2008, 02:57:45
en realidad creo un componente TImage en tiempo de ejecucion, pero quiero ke este componente se cree como si fuera un hilo del proceso, pero... basicamente mi problema es otro, que ahora estoy viendo la salida, TTimer trabaja con el tiempo del sistema, esto es 1 ms de ttimer mas o menos seria 50 ms en la realidad (dependiendo de la maquina), y queria que mi imagen tenga una animacion extremadamente rapida, y aparentemente no tengo que usar ttimer para este caso, sino usar el reloj de multimedia, multimedia timer creo ke me apure en mi busqueda de la respuesta

pulpin
10-04-2008, 04:21:16
pues yo estoy en algo parecido, un osciloscopio. me encontre esta pagina en internet que habla sobre hilos, en la cual dicen que dentro de la ejecucion del mismo no debemos tener componenetes de dibujo sino que debemos hacer una llamada a otra rutina que se encargara de esto.....

http://www.programacionfacil.com/cpp_builder:multiprocesamiento

el inconveniente que tengo en este momento es un parpaddeo de la imagen por la velocidad de refresco de la misma, lo que espero no te suceda, bueno espero que esto te ayude.
suerte.:)

grandmasterdari
10-04-2008, 04:41:50
para quitar el parpadeo de las imagenes debes colocar este comando

DoubleBuffered=true;


en el momento que se crea el formulario, o sea en formcreate

grandmasterdari
14-04-2008, 14:32:48
Ok vuelvo al tema, Necesito crear un hilo que sea un componente. Logre utilizar Multimedia time de mmsystem.h pero es demasiado rapido para mi componente TImage, creo ke es demasiado rapido para la aplicacion en si. Entonces vuelvo a mi primera pregunta
¿Como puedo crear un hilo TImage?

Delfino
14-04-2008, 15:27:44
Si lo q quieres es un timer q se ejecute en un hilo esta el componente TJvThreadTimer de la JVCL (http://homepages.codegear.com/jedi/jvcl/), q hace q el código en su evento OnTimer se ejecute en un hilo..

grandmasterdari
14-04-2008, 15:38:25
Si, pero en realidad quiero hacer un thread de TImage solo TImage, ya que timage debe tener vida propia (mi TImage tiene una animacion mediante un TTimer). Pero olvidemosno de el tiempo y el espacio.

thread de Timage

(sin usar el poder de los Jedi) :D

grandmasterdari
30-04-2008, 14:39:36
Mi problema es este, cada TImage en un determinado tiempo cambia la imagen.
Cuando TTimer en interval==1 llama a los TImage y realiza un cambio en la imagen y esto funciona, da la impresion de que tiene una animacion.
El problema esta en que tengo una matriz de TImage donde hay una sola que tiene animacion (Image1), y el resto son imagenes que cuando pasa el mouse por arriba realiza un cambio de imagen y pasa de un foco apagado (la imagen claro) a un foquito prendido, el tema esta es que cuando muevo el mouse para todos lados se prenden y se apagan muchos foquitos a la vez y la animacion de Image1 se interrumpe y queda estatico.

captura en t0 (te sub cero, se lee como en fisica o analisis matematico)
captura1 (http://s1.subirimagenes.com/otros/399381dibujo1.jpg)

captura en t1
captura2 (http://s1.subirimagenes.com/otros/399389dibujo2.jpg)

el codigo que voy a colocar es mas informativo que para entiendan ya que el problema es el congelamiendo de la animacion del gato cuando el puntero del mouse se mueve a alta velocidad y realiza varios cambios en las esferas
codigo de las esferas verdes

void __fastcall TForm1::LosaEnter(TObject *Sender)
{
TImage1 *aux = (TImage1 *)(Sender);
if(aux->Enabled==true){
if(resolucion==1)
aux->Picture->LoadFromFile("imagenes\\losa1-640x480.bmp");
if(resolucion==2)
aux->Picture->LoadFromFile("imagenes\\losa1-800x600.bmp");
if(resolucion==3){
aux->Picture->LoadFromFile("imagenes\\losa1-1024x768.bmp");
}
}
}
void __fastcall TForm1::LosaLeave(TObject *Sender)
{
TImage1 *aux = (TImage1 *)(Sender);
if(aux->Enabled==true){
if(resolucion==1)
aux->Picture->LoadFromFile("imagenes\\losa-640x480.bmp");
if(resolucion==2)
aux->Picture->LoadFromFile("imagenes\\losa-800x600.bmp");
if(resolucion==3){
aux->Picture->LoadFromFile("imagenes\\losa-1024x768.bmp");
}
}
}



codigo de la animacion del gato


void __fastcall Gatos::Timer1Timer(TObject *Sender)
{
int aux;//variable que va a guardar la animacion tomada de la cola
int i,j;//variables donde se guardan las posiciones
if(t==0){
//reproducir sonidos
if(primson!=NULL){//lista cargada
son=primson;
while(son!=NULL){
if(son->animno==currentanim){
if(son->imageno==p->id){
//reproducir
PlaySound(son->path,NULL,SND_ASYNC);
}
}
son=son->prox;
}
}
//fin reproducir sonidos
p=p->prox;
if(p->prox==NULL){
t=-1;
}
else{
t=p->t;
Width=p->w;
Height=p->h;
Left=resleft-p->xc;
Top=restop-p->yc;
this->Picture->LoadFromFile(p->str);
}
}
else{
if(t>-1)
t--;
}
//descuento del tiempo total
if(tt<=0){
control=true;
//posicionar si es que hay cola en posicionar;
if(primcolapos!=NULL){//hay una posicion en espera
i=primcolapos->i;
j=primcolapos->j;
colapos=primcolapos->prox;
delete primcolapos;
primcolapos=colapos;
posicionar(i,j);
}
//cambiar anim si es que hay cola en anim
if(primcolaanim!=NULL){//hay animaciones en la cola
aux=primcolaanim->n;
colaanim=primcolaanim->prox;
delete primcolaanim;
primcolaanim=colaanim;
cambiaranim(aux);
}
this->Parent->Enabled=true;
}
else
tt--;
}