Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > OOP
Registrarse FAQ Miembros Calendario Guía de estilo Buscar Temas de Hoy Marcar Foros Como Leídos


Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 16-04-2007
Avatar de MaMu
MaMu MaMu is offline
Miembro
 
Registrado: abr 2006
Ubicación: Argentina
Posts: 863
Poder: 12
MaMu Va por buen camino
Unhappy Como hago esto? multi thread?!?!

Tengo un problema, resulta que yo ejecuto un bucle usando un FOR y un REPEAT que dependiendo de el valor que tome una variable cumple las siguientes ordenes

Código:
 
repeat
for w:=0 to ADOQuery1.RecordCount-1 do
  begin
     //mis sentencias.....
  end;
  x:=x-1;
until x=0;
Hasta aca no hay problema alguno y todo se ejecura correctamente.
Pero me pasa en un caso especial, en donde necesito que el Repeat sea infinito, es decir que nunca pare. Tambien puedo hacerlo asignandole una condición que nunca se va a cumplir y listo. Pero mi pregunta es la siguiente:
como hago para detener un ciclo infinito? hacer una suerte de parada de emergencia, porque mientras se ejecuta el ciclo infinito, pierdo el control de la aplicacion, no lo puedo cortar con nada.

Lo que pienso es que debo dejar residente en memoria la parada de emergencia antes de ejecutar el bucle infinito, no se si estoy en lo correcto.

Alguien me puede dar una mano?

Gracias igualmente
__________________
Código Delphi [-]
 
try 
ProgramarMicro(80C52,'Intel',MnHex,True);
except
On Exception do
MicroChip.IsPresent(True);
end;
Responder Con Cita
  #2  
Antiguo 16-04-2007
luisgutierrezb luisgutierrezb is offline
Miembro
 
Registrado: oct 2005
Ubicación: México
Posts: 901
Poder: 13
luisgutierrezb Va por buen camino
dentro del bucle puedes usar el application.processmessages y con algun boton ayudado por una variable el break para salir del ciclo si lo quieres cortar
Responder Con Cita
  #3  
Antiguo 16-04-2007
Avatar de seoane
[seoane] seoane is offline
Miembro Premium
 
Registrado: feb 2004
Ubicación: A Coruña, España
Posts: 3.717
Poder: 17
seoane Va por buen camino
Lo primero es permitir que la "parada" se produzca. Mientras ejecutas un bucle, el resto de la aplicación queda congelada, así que no podríamos indicarle que parase de ninguna manera, ni pulsando un botón, ni una tecla, etc ... así que tenemos que dejar "respirar" a la aplicación. Esto podemos hacerlo de 2 maneras diferentes: usando threads o metiendo dentro del bucle la función "Application.Processmessages".

Yo para un bucle que se tiene que ejecutar "indefinidamente", o por lo menos durante un largo periodo de tiempo, prefiero usar un thread. Este correría de forma paralela al resto de la aplicación. Dentro del thread haría algo como esto:
Código Delphi [-]
repeat
 
until Terminated; // Terminated es una propiedad del objeto TTHread
De esta manera cuando quisiera finalizar el bucle solo tendría que llamar al método "Terminate" del TThread, y el se encargara de poner a TRUE la propiedad Terminated.

Por ejemplo:
Código Delphi [-]
MiThread:= TMiThread.Create;
MiThread.FreeOnTerminate:= TRUE;
ShowMessage('Pulsa aceptar para finalizar');
MiThread.Terminate;
Donde TMiThread seria una clase descendiente de TThread.
Responder Con Cita
  #4  
Antiguo 16-04-2007
Avatar de MaMu
MaMu MaMu is offline
Miembro
 
Registrado: abr 2006
Ubicación: Argentina
Posts: 863
Poder: 12
MaMu Va por buen camino
Me gusta lo del Thread pero realmente no logro hacerlo, no se donde debo meterlo.

Código:
 
procedure TSecuenciador.dxButton2Click(Sender: TObject);
var MiTHread:TTHread;
     w,x:integer;
begin
   if CheckBox1.Chequed=True   //opcion de infinito o por bucles
     then begin
              //bucle infinito
            end
     else begin
              x:=StrToInt(SpinEdit1.Text);
             //bucle por ciclos
               repeat
                  for w:=0 to ADOQuery1.RecordCount-1 do
                      begin
                         //mis sentencias.....
                      end;
                    x:=x-1;
               until x=0;
            end; 
end;
Gracias por la ayuda.
__________________
Código Delphi [-]
 
try 
ProgramarMicro(80C52,'Intel',MnHex,True);
except
On Exception do
MicroChip.IsPresent(True);
end;
Responder Con Cita
  #5  
Antiguo 16-04-2007
Avatar de Chris
[Chris] Chris is offline
Miembro Premium
 
Registrado: abr 2007
Ubicación: Jinotepe, Nicaragua
Posts: 1.676
Poder: 12
Chris Va por buen camino
dentro de la unidad el thread podrás encontrar el procedimiento execute, en el realizarás las operaciones y calculos que necesites. Es muy recomendable que utilices un thread para esto. ademas, al momento de hacer el llamado MiThread:= TMiThread.Create; tienes un parámetro llamado CreateSuspended, el cual le indica al sistema si el thread se ejecutará de inmediato luego de ser creado o tu lo iniciarás manualmente con el procedimiento Mithread.Resume;

Si alguna de las operaciones que necesitas son manipular los controles o componentes de algún formulario entonces debes de tener cuidado al utilizar el thread porque sino terminarás con un AccessViolation at .... Para evitar esto tiene que utilizar un procedimiento de la clase TThread llamado syncronize y su forma de utilizado es ...

Código Delphi [-]
TMiThread.ActualizarControles;
begin
 form1.label1.caption := 'x porciendo del proceso completado';
end;

{para llamar al procedimiento anterior desde el procedimiento execute lo haces de la siguiente manera con syncronize}
TMiThread.Execute;
begin
  ...

   Syncronize(ActualizarControles);

  ...

end;

De esta forma te evitaras los fastidios AccessViolatios.

Esto es lo que te puedo decir por ahora, pero siempre ten cuidado con la sincronización porque puedes terminar con un grave bug dentro de tu aplicación.

Última edición por Chris fecha: 16-04-2007 a las 22:10:20.
Responder Con Cita
  #6  
Antiguo 16-04-2007
Avatar de MaMu
MaMu MaMu is offline
Miembro
 
Registrado: abr 2006
Ubicación: Argentina
Posts: 863
Poder: 12
MaMu Va por buen camino
Cita:
Empezado por D&W
dentro de la unidad el thread podrás encontrar el procedimiento exceute, en el realizarás las operaciones y calculos que necesites. Es muy recomendable que utilizes un thread para esto.
Pero no esta el procedimiento execute. Lo unico que tengo es lo que me aparece cuando escribo MiThread. .......listado....... pero execute no esta.

Saludos
__________________
Código Delphi [-]
 
try 
ProgramarMicro(80C52,'Intel',MnHex,True);
except
On Exception do
MicroChip.IsPresent(True);
end;
Responder Con Cita
  #7  
Antiguo 16-04-2007
Avatar de seoane
[seoane] seoane is offline
Miembro Premium
 
Registrado: feb 2004
Ubicación: A Coruña, España
Posts: 3.717
Poder: 17
seoane Va por buen camino
Bueno, aqui te dejo un ejemplo muy simple de como usar un thread.

Código Delphi [-]
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;

type
  TForm1 = class(TForm)
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

  // Aquí declaramos una clase nueva descendiente TThread
  TMiThread = class(TThread)
  protected
    procedure Execute; override;
  public
    constructor Create;
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

// Este es el evento OnClick de un boton que coloque en el formulario
procedure TForm1.Button1Click(Sender: TObject);
var
  MiThread: TMiThread;
begin
  // Creamos el thread 
  MiThread:= TMiThread.Create;
  // Mostramos un mensaje
  ShowMessage('Pulsa aceptar para terminar');
  // Cuando el mensaje se cierra, terminamos el thread 
  Mithread.Terminate;
end;

{ TMiThread }

constructor TMiThread.Create;
begin
  inherited Create(FALSE);
  // Aqui le indicamos que cuando la ejecucion del thread termine
  // debe liberar el objeto TMithread
  FreeOnTerminate:= TRUE;
end;

// Este procedimiento se llama justo después de crear el objeto, y se
// ejecuta de forma paralela al resto de la aplicación.
procedure TMiThread.Execute;
begin
  repeat
    Windows.Beep(500,100);
    // Siempre que tengamos un bucle de este tipo, es conveniente usar algún
    // retardo para no abusar de la CPU. A lo mejor en tu código no es necesario.
    Sleep(1000);
  until Terminated;
end;

end.

En el ejemplo anterior, hacemos sonar un pitido a intervalos de un segundo. Como ves, el bucle se tiene que insertar en el método "Execute" del TThread.
Responder Con Cita
  #8  
Antiguo 16-04-2007
Avatar de MaMu
MaMu MaMu is offline
Miembro
 
Registrado: abr 2006
Ubicación: Argentina
Posts: 863
Poder: 12
MaMu Va por buen camino
Gracias muchachos, al final logré solucionar el tema. Lo que encuentro interesante es la forma en que pueden dividirse las instrucciones. yo que hago programas para controlar hardware externo, me viene como anillo al dedo.

Saludos
__________________
Código Delphi [-]
 
try 
ProgramarMicro(80C52,'Intel',MnHex,True);
except
On Exception do
MicroChip.IsPresent(True);
end;
Responder Con Cita
Respuesta


Herramientas Buscar en Tema
Buscar en Tema:

Búsqueda Avanzada
Desplegado

Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro

Temas Similares
Tema Autor Foro Respuestas Último mensaje
¿Como hago esto? IZO API de Windows 5 02-03-2007 21:37:38
Thread bendito thread...se me pierde la ventana Seba.F1 API de Windows 5 02-02-2006 01:16:30
Como hago esto en Delphi ? Markos1970 OOP 5 19-12-2005 16:40:29
como hago esto meosre MySQL 3 06-10-2005 18:14:09
Base de datos multi área (multi departamento) Al González Conexión con bases de datos 0 19-03-2004 17:27:14


La franja horaria es GMT +2. Ahora son las 02:10:38.


Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2017, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi
Copyright 1996-2007 Club Delphi