Мастера DELPHI, Delphi programming community Рейтинг@Mail.ru Титульная страница Поиск, карта сайта Написать письмо 
| Новости |
Новости сайта
Поиск |
Поиск по лучшим сайтам о Delphi
FAQ |
Огромная база часто задаваемых вопросов и, конечно же, ответы к ним ;)
Статьи |
Подборка статей на самые разные темы. Все о DELPHI
Книги |
Новинки книжного рынка
Новости VCL
Обзор свежих компонент со всего мира, по-русски!
|
| Форумы
Здесь вы можете задать свой вопрос и наверняка получите ответ
| ЧАТ |
Место для общения :)
Орешник
Коллекция курьезных вопросов из форумов
Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / rsdn.org

 
Чтобы не потерять эту дискуссию, сделайте закладку « предыдущая ветвь | форум | следующая ветвь »

перезапуск потока [D7]


валя ©   (21.11.17 21:25

вот примерчик:

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]

http://gurin.tomsknet.ru/delphithreads.html


версия для печати

Написать ответ

Ваше имя (регистрация  E-mail 







Разрешается использование тегов форматирования текста:
<b>жирный</b> <i>наклонный</i> <u>подчеркнутый</u>,
а для выделения текста программ, используйте <code> ... </code>
и не забывайте закрывать теги! </b></i></u></code> :)


Наверх

  Рейтинг@Mail.ru     Титульная страница Поиск, карта сайта Написать письмо