Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Delphi Новый топик    Ответить
 TThread. Нужна ли в приведенном коде синхронизация?  [new]
stanilar
Member

Откуда: Спб
Сообщений: 850
  TTestThread = class(TThread)
  public
    Value : Longint;
    procedure Execute; override;
  end;

  TThreadForm = class(TForm)
    ProgressBar1: TProgressBar;
    Timer1: TTimer;
    procedure FormShow(Sender: TObject);
    procedure Timer1Timer(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
    Thread : TTestThread;
  end;


procedure TTestThread.Execute;
begin
  while not Terminated do Value := Value + 1;
end;

procedure TThreadForm.FormShow(Sender: TObject);
begin
  ProgressBar1.Max := High(Longint) div 2;
  Thread := TTestThread.Create(False);
end;

procedure TThreadForm.Timer1Timer(Sender: TObject);
begin
  if Thread.Value > ProgressBar1.Max then
  begin
    Thread.suspend;
    Thread.Value := 0;
    Thread.Resume;
  end;

  ProgressBar1.Position := Thread.Value;
end;


При этом ProgressBar1 только информирует пользователя о том, что поток работает, а не повис.
30 сен 13, 14:01    [14901512]     Ответить | Цитировать Сообщить модератору
 Re: TThread. Нужна ли в приведенном коде синхронизация?  [new]
Марат Сафин
Member

Откуда:
Сообщений: 619
stanilar,
Чтение не требует блокировки.
30 сен 13, 14:06    [14901560]     Ответить | Цитировать Сообщить модератору
 Re: TThread. Нужна ли в приведенном коде синхронизация?  [new]
Dimitry Sibiryakov
Member

Откуда:
Сообщений: 48796

Синхронизация не нужна, нужно код переписать. Проверку на переполнение и сброс счётчика
перенести в поток, suspend-resume из таймера убрать.

Posted via ActualForum NNTP Server 1.5

30 сен 13, 14:06    [14901565]     Ответить | Цитировать Сообщить модератору
 Re: TThread. Нужна ли в приведенном коде синхронизация?  [new]
stanilar
Member

Откуда: Спб
Сообщений: 850
Dimitry Sibiryakov
Проверку на переполнение и сброс счётчика перенести в поток


Переделал:

+

  TTestThread = class(TThread)
  public
    Value : Longint;
    procedure Execute; override;
  end;

  TThreadForm = class(TForm)
    ProgressBar1: TProgressBar;
    Timer1: TTimer;
    procedure FormShow(Sender: TObject);
    procedure Timer1Timer(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
    Thread : TTestThread;
  end;

var
  ThreadForm: TThreadForm;

procedure TTestThread.Execute;
begin
  while not Terminated do
  begin
    Value := Value + 1;
    if Value > ThreadForm.ProgressBar1.Max then
      Value := 0;
  end;
end;

procedure TThreadForm.FormShow(Sender: TObject);
begin
  ProgressBar1.Max := High(Longint) div 2;
  Thread := TTestThread.Create(False);
end;

procedure TThreadForm.Timer1Timer(Sender: TObject);
begin
  ProgressBar1.Position := Thread.Value;
end;

30 сен 13, 14:31    [14901781]     Ответить | Цитировать Сообщить модератору
 Re: TThread. Нужна ли в приведенном коде синхронизация?  [new]
wadman
Member

Откуда: Санкт-Петербург
Сообщений: 26223
stanilar
procedure TTestThread.Execute;

Хоть бы Sleep(1) в цикл добавил.
30 сен 13, 14:33    [14901799]     Ответить | Цитировать Сообщить модератору
 Re: TThread. Нужна ли в приведенном коде синхронизация?  [new]
Dimitry Sibiryakov
Member

Откуда:
Сообщений: 48796

stanilar
Переделал:

Как там в пословице про бога и лоб?..
procedure TTestThread.Execute;
begin
   while not Terminated do
   begin
     Inc(Value);
   end;
end;

procedure TThreadForm.Timer1Timer(Sender: TObject);
begin
   ProgressBar1.Position := Thread.Value mod ProgressBar1.Max;
end;

Posted via ActualForum NNTP Server 1.5

30 сен 13, 14:37    [14901839]     Ответить | Цитировать Сообщить модератору
 Re: TThread. Нужна ли в приведенном коде синхронизация?  [new]
stanilar
Member

Откуда: Спб
Сообщений: 850
Dimitry Sibiryakov
Проверку на переполнение и сброс счётчика перенести в поток
30 сен 13, 14:40    [14901867]     Ответить | Цитировать Сообщить модератору
 Re: TThread. Нужна ли в приведенном коде синхронизация?  [new]
Dimitry Sibiryakov
Member

Откуда:
Сообщений: 48796

Но не таким же способом, который грубо нарушает инкапсуляцию.

Posted via ActualForum NNTP Server 1.5

30 сен 13, 14:56    [14901999]     Ответить | Цитировать Сообщить модератору
 Re: TThread. Нужна ли в приведенном коде синхронизация?  [new]
stanilar
Member

Откуда: Спб
Сообщений: 850
Вам сложно угодить.
30 сен 13, 15:04    [14902059]     Ответить | Цитировать Сообщить модератору
Все форумы / Delphi Ответить