Конференция "Начинающим" » перезапуск потока [D7]
 
  • валя © (21.11.17 21:25) [0]
    вот примерчик:

    unit Unit1;

    interface

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

    type
     TForm1 = class(TForm)
       Label1: TLabel;
       procedure FormKeyDown(Sender: TObject; var Key: Word;
         Shift: TShiftState);
       procedure FormCreate(Sender: TObject);
     private
       { Private declarations }
     public
       { Public declarations }
     end;

     TMyThread = class(TThread)
     private

     protected
       procedure Execute; override;
     public

     end;

    var
     Form1: TForm1;
     MyThread: TMyThread;

    implementation

    {$R *.dfm}

    procedure TForm1.FormCreate(Sender: TObject);
    begin
     MyThread := TMyThread.Create(True);
     MyThread.FreeOnTerminate := False;
     MyThread.Priority := tpLower;
    end;

    procedure TMyThread.Execute;
    var
     i: Integer;
    begin
     for i := 0 to 100 do begin
       Form1.Label1.Caption := IntToStr(i);
       sleep(100);
     end;
    end;

    procedure TForm1.FormKeyDown(Sender: TObject; var Key: Word;
     Shift: TShiftState);
    begin
     MyThread.Resume
    end;

    end.



    Как по нажатию кнопки перестартовывать поток, начиная счетчик с нуля?
  • Pavia © (21.11.17 22:41) [1]
    И зачем вы выкинула while not Terminated do ? Вот теперь обратно положите.
    В цикле пишите условие
    if fReset then OnReset()
    А в OnReset() обнуляете свой счётчик Counter:=0;
    Counter положите в объект.

    Сеттаре ресета выставляете флаг fReset. Только не забудьте его защитить, так как эта общая переменная доступная из разных потоков.
  • aka © (22.11.17 09:40) [2]

    > Как по нажатию кнопки перестартовывать поток, начиная счетчик
    > с нуля?


    unit Unit1;

    interface

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

    type
     TForm1 = class(TForm)
       Label1: TLabel;
       procedure FormCreate(Sender: TObject);
       procedure FormKeyDown(Sender: TObject; var Key: Word;
         Shift: TShiftState);
     private
       { Private declarations }
     public
       { Public declarations }
     end;

    TMyThread = class(TThread)
    private
      Counter: Integer;
    protected
      procedure Execute; override;
    public
      procedure OnReset;
    end;

    var
     Form1: TForm1;
     MyThread: TMyThread;

    implementation

    {$R *.dfm}

    procedure TForm1.FormCreate(Sender: TObject);
    begin
    MyThread := TMyThread.Create(True);
    MyThread.FreeOnTerminate := False;
    MyThread.Priority := tpNormal;
    end;

    procedure TMyThread.OnReset;
    begin
     Counter := 0;
    end;

    procedure TMyThread.Execute;
    begin
     while not Terminated do begin
       while Counter < 100 do begin
         Form1.Label1.Caption := IntToStr(Counter);
         sleep(100);
         Inc(Counter);
       end;
     end;
    end;

    procedure TForm1.FormKeyDown(Sender: TObject; var Key: Word;
     Shift: TShiftState);
    begin
      MyThread.OnReset;
      MyThread.Resume;
    end;

    end.

  • Игорь Шевченко © (22.11.17 10:37) [3]

    > procedure TMyThread.Execute;
    > begin
    >  while not Terminated do begin
    >    while Counter < 100 do begin
    >      Form1.Label1.Caption := IntToStr(Counter);
    >      sleep(100);
    >      Inc(Counter);
    >    end;
    >  end;
    > end;


    Для вас, Козлов, специально Borland в комментариях пишет:

    { Important: Methods and properties of objects in visual components can only be
     used in a method called using Synchronize, for example,

         Synchronize(UpdateCaption);

     and UpdateCaption could look like,

       procedure foo.UpdateCaption;
       begin
         Form1.Caption := 'Updated in a thread';
       end; }

  • kilkennycat © (22.11.17 12:29) [4]
 
Конференция "Начинающим" » перезапуск потока [D7]
Есть новые Нет новых   [118240   +20][b:0][p:0.002]