Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Varios (https://www.clubdelphi.com/foros/forumdisplay.php?f=11)
-   -   parar bucle (https://www.clubdelphi.com/foros/showthread.php?t=30174)

Cosgaya 10-02-2006 10:41:06

parar bucle
 
hola
¿se puede hacer que un bucle while en tiempo de ejecucion se pause o se detenga?

FunBit 10-02-2006 10:55:22

Revisa Application.ProcessMessages.

A lo mejor te da alguna idea...

Saludos!

Neftali [Germán.Estévez] 10-02-2006 11:06:55

Si lo que quieres es interrumpirlo, puedes añadirle un flag a la condición.

Código Delphi [-]
while (condicion) do begin
...
end;



Código Delphi [-]
flag := false;
while (condicion) and (not flag) do begin
...
end;

Cuando quieres interumpirlo, basta con que en algún sitio (dentro o fuera del bucle) actives el Flag.

Código Delphi [-]
  flag := true;

No se si es a esto a lo que te refieres...
Tal vez deberías dar más detalles de lo que quieres.

Cosgaya 10-02-2006 11:26:52

si, para pararlo eso me sirve, ahoro tengo que averiguar como pausarlo.
gracias neftali

Neftali [Germán.Estévez] 10-02-2006 13:12:31

Creo que si necesitas "pausar" un bucle, es que no estás realizando un diseño correcto.
Por más que pienso en cómo "pausar" un bucle, sólo se me ocurre generando una espera activa (un bucle en su interior que no haga nada).
Ésta opción es mala; Muy mala por el consumo de recursos.

De ahí que creo que tal vez lo que estás pensando se pueda hacer de otra forma más "adecuada"; Tal vez si te explicas mejor...

Cosgaya 10-02-2006 13:18:22

hola neftali hice lo que me dijiste para parar el bucle:
Código Delphi [-]
flag := false;
while (condicion) and (not flag) do begin
...
end;
y despues en un button aparte le cambio el valor de flag a true
Código Delphi [-]
flag :=true;

pero esque el programa me ocupa el 99% del procesador y no me deja apretar el boton
hay alguna otra manera de pararlo?

Neftali [Germán.Estévez] 10-02-2006 13:58:40

Cita:

Empezado por Cosgaya
...
pero esque el programa me ocupa el 99% del procesador y no me deja apretar el boton hay alguna otra manera de pararlo?

Pon dentro del bucle lo que te han comentado antes:

Código Delphi [-]
  Application.ProcessMessages;

vtdeleon 10-02-2006 14:09:18

Saludos

Creo que un Break puede solucionar eso.

Hice una prueba
Código Delphi [-]
var
  Flag:Boolean;
  n:integer;
begin
  n:=0;
  Flag:=True;
  Flag2:=False;//Variable Global
  while Flag do begin
    Application.ProcessMessages;
    Inc(n);
    Label2.Caption:=IntToStr(n);
    if Flag2 then//Se de asigna True en otra rutina
      break;
  end;

end;

Neftali [Germán.Estévez] 10-02-2006 15:32:39

Código Delphi [-]
  while Flag do begin
    Application.ProcessMessages;
    Inc(n);
    Label2.Caption:=IntToStr(n);
    if Flag2 then//Se de asigna True en otra rutina
      break;
  end;
Creo que son equivalentes.

Código Delphi [-]
  while Flag and (not Flag2) do begin
    Application.ProcessMessages;
    Inc(n);
    Label2.Caption:=IntToStr(n);
  end;

vtdeleon 10-02-2006 16:07:08

Cita:

Empezado por neftali
Creo que son equivalentes.

It's true. :rolleyes:

Saludos

FunBit 10-02-2006 16:14:30

Cosgaya si nos comentas el objetivo del búcle quizas podamos encontrar una alternativa...

Saludos!

Cosgaya 11-02-2006 16:01:56

el objetivo para el bucle es un generador de contraseñas:
este es el codigo:
Código Delphi [-]
var
flag :boolean;
procedure TForm1.Button1Click(Sender: TObject);
var
pass: Array of String;
num1:integer;
num2:integer;
num3:integer;
num4:integer;
num5:integer;
num6:integer;
num7:integer;
num8:integer;
begin
setlength(pass, 64);
pass[0]:='a';
pass[1]:='b';
pass[2]:='c';
pass[3]:='d';
pass[4]:='e';
pass[5]:='f';
pass[6]:='g';
pass[7]:='h';
pass[8]:='i';
pass[9]:='j';
pass[10]:='k';
pass[11]:='l';
pass[12]:='m';
pass[13]:='n';
pass[14]:='ñ';
pass[15]:='o';
pass[16]:='p';
pass[17]:='q';
pass[18]:='r';
pass[19]:='s';
pass[20]:='t';
pass[21]:='u';
pass[22]:='v';
pass[23]:='w';
pass[24]:='x';
pass[25]:='y';
pass[26]:='z';
pass[27]:='A';
pass[28]:='B';
pass[29]:='C';
pass[30]:='D';
pass[31]:='E';
pass[32]:='F';
pass[33]:='G';
pass[34]:='H';
pass[35]:='I';
pass[36]:='J';
pass[37]:='K';
pass[38]:='L';
pass[39]:='M';
pass[40]:='N';
pass[41]:='Ñ';
pass[42]:='O';
pass[43]:='P';
pass[44]:='Q';
pass[45]:='R';
pass[46]:='S';
pass[47]:='T';
pass[48]:='U';
pass[49]:='V';
pass[50]:='W';
pass[51]:='X';
pass[52]:='Y';
pass[53]:='Z';
pass[54]:='0';
pass[55]:='1';
pass[56]:='2';
pass[57]:='3';
pass[58]:='4';
pass[59]:='5';
pass[60]:='6';
pass[61]:='7';
pass[62]:='8';
pass[63]:='9';
num1:=0;
num2:=0;
num3:=0;
num4:=0;
num5:=0;
num6:=0;
flag := false;
while (num1 <=63) and (not flag)do
begin
memo1.lines.add(pass[num1]+pass[num2]+pass[num3]+pass[num4]+pass[num5]+pass[num6]);
num6 := num6 +1;
  if num6 =64 then
  begin
  num6:=0;
  num5 := num5 +1;
  end;
  if num5 =64 then
  begin
  num5:=0;
  num4 := num4 +1;
  end;
  if num4 =64 then
  begin
  num4:=0;
  num3 := num3 +1;
  end;
  if num3 =64 then
  begin
  num3:=0;
  num2 := num2 +1;
  end;
  if num2 =64 then
  begin
  num2:=0;
  num1 := num1 +1;
  end
end
end;


La franja horaria es GMT +2. Ahora son las 08:44:02.

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