Newsgroup: it.comp.lang.delphi
Titolo: Pausa in un ciclo

Supponiamo che io abbia un programma che deve passare per un ciclo
moltissime volte (qualche milione) e che io voglia avere la possibilità di
poterlo mettere in pausa per mezzo di un click su un bottone. Come mi
consigliate di fare senza dover fare ricorso a Sleep?
Grazie, Poochie

 ha scritto nel messaggio
news:YSxoa.53560$iy5.1...@twister2.libero.it...

Potresti usare un timer...che quando scatta esegue...le operazioni del tuo
ciclo
e quando premi il bottone abiliti/disabiliti il timer in modo che quelle
operazioni
non vengano più eseguite.
ciao
AleZ

 poterlo mettere in pausa per mezzo di un click su un bottone.
non ho molto tempo quindi ti posto
dopo i saluti il codice di una unit demo
che credo risponda alle tue esigenze.
"simula" il funzionamento di un Thread
comunque è un metodo "rischioso" ...
per questo ti consiglio l'uso di un thread vero e proprio
che dispone delle proprietà per metterlo in pausa o fermarlo
anche se non è di implementazione elementare ...
  ciao e "Auguri a tutti"
  Mak
//Codice Unit////////////////////////////////////////////////////
unit Unit1;
interface
uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;
type
  TForm1 = class(TForm)
    Label1: TLabel;
    Button1: TButton;
    Button2: TButton;
    Button3: TButton;
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
    procedure Button3Click(Sender: TObject);
  private
    paused: boolean;
    stopped: boolean;
    { Private declarations }
  public
    Procedure cicloLungo;
    { Public declarations }
  end;
var
  Form1: TForm1;
implementation
{$R *.dfm}
{ TForm1 }
procedure TForm1.cicloLungo;
var
        I: Integer;
begin
  For I := 0 To 10000000 do
  Begin
        If Stopped Then
        begin
          Label1.Caption := 'Stopped';
          Exit;
        end;
        Label1.Caption := IntTostr(I);
        //qui va il tuo codice
        Application.ProcessMessages;
        While Paused do
        begin
          Label1.Caption := 'Paused';
          Application.ProcessMessages;
        End;
  End;
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
 stopped := false;
 paused := false;
 cicloLungo;
end;
procedure TForm1.Button2Click(Sender: TObject);
begin
 paused := NOT paused;
end;
procedure TForm1.Button3Click(Sender: TObject);
begin
        Stopped := True;
end;
end.
//DFM//////////////////////////////////////////////////////////////////////
object Form1: TForm1
  Left = 284
  Top = 166
  Width = 283
  Height = 98
  Caption = 'Form1'
  Color = clBtnFace
  Font.Charset = DEFAULT_CHARSET
  Font.Color = clWindowText
  Font.Height = -11
  Font.Name = 'MS Sans Serif'
  Font.Style = []
  OldCreateOrder = False
  PixelsPerInch = 96
  TextHeight = 13
  object Label1: TLabel
    Left = 8
    Top = 8
    Width = 32
    Height = 13
    Caption = 'Label1'
  end
  object Button1: TButton
    Left = 8
    Top = 24
    Width = 75
    Height = 25
    Caption = 'Avvia'
    TabOrder = 0
    OnClick = Button1Click
  end
  object Button2: TButton
    Left = 88
    Top = 24
    Width = 75
    Height = 25
    Caption = 'Pausa'
    TabOrder = 1
    OnClick = Button2Click
  end
  object Button3: TButton
    Left = 168
    Top = 24
    Width = 75
    Height = 25
    Caption = 'Stop'
    TabOrder = 2
    OnClick = Button3Click
  end
end

 ha scritto nel messaggio
news:%Rzoa.53866$DT4.1...@twister1.libero.it...


 che l'applicazione non utilizzasse cosě tanta cpu!
e hai ragione ... :)
usavo una cosa del genere in un prog...
ma effettivamente doveva funzionare
su pause molto, molto brevi ...
forza thread ... :)
  Ciao
  Mak

 > che l'applicazione non utilizzasse così tanta cpu!


 Come mi consigliate di fare senza dover fare ricorso a Sleep?
A parte che non vedo come la Sleep possa risolvere il tuo problema (essa,
infatti, blocca il thread chiamante per il tempo indicato come parametro)
sarebbe sempre preferibile evitare di utilizzare questa istruzione all'
interno del proprio codice
--
- Carlo -

Il metodo corretto e' usare i Thread.
Con due pulsanti puoi stoppare e ripartire il thread (che quando e' bloccato
non consuma cpu).
Se devi condividere variabili tra il thread principale e quello secondario,
ricordati di ricorrere agli oggetti di sincronizzazione.
Ciao!