Есть максимально простая задача: в длительном цикле необходимо так или иначе показывать пользователю номер текущей итерации. Делаю это с помощью ProgressBar. При этом если использую главный поток (кнопка 1), то результат вижу по окончании цикла, когда ProgressBar уже заполнен, а когда использую дополнительный поток (кнопка 2) - вижу постепенное заполнение ProgressBar, чего и пытаюсь добиться в главном потоке. Почему так? Такое ощущение, что от меня ускользает какой-то важный принцип использования FMX. Кто-нибудь может объяснить происходящее? Код ниже. Спасибо!
type
TForm1 = class(TForm)
Button1: TButton;
Button2: TButton;
ProgressBar1: TProgressBar;
Button3: TButton;
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
procedure Button3Click(Sender: TObject);
private
procedure Test;
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
uses
System.Threading;
{$R *.fmx}
procedure TForm1.Button1Click(Sender: TObject);
begin
Test;
end;
procedure TForm1.Button2Click(Sender: TObject);
begin
TTask.Run(
Test
);
end;
procedure TForm1.Button3Click(Sender: TObject);
begin
ProgressBar1.Value := 0;
end;
procedure TForm1.Test;
const
n = 200;
var
I: Integer;
begin
ProgressBar1.Min := 0;
ProgressBar1.Max := n - 1;
for I := 0 to n - 1 do
begin
ProgressBar1.Value := I;
sleep(10);
end;
end;
Вопрос
antigrav
Коллеги, здравствуйте!
Есть максимально простая задача: в длительном цикле необходимо так или иначе показывать пользователю номер текущей итерации. Делаю это с помощью ProgressBar. При этом если использую главный поток (кнопка 1), то результат вижу по окончании цикла, когда ProgressBar уже заполнен, а когда использую дополнительный поток (кнопка 2) - вижу постепенное заполнение ProgressBar, чего и пытаюсь добиться в главном потоке. Почему так? Такое ощущение, что от меня ускользает какой-то важный принцип использования FMX. Кто-нибудь может объяснить происходящее? Код ниже. Спасибо!
unit Unit1;
interface
uses
System.SysUtils, System.Types, System.UITypes, System.Classes, System.Variants,
FMX.Types, FMX.Controls, FMX.Forms, FMX.Graphics, FMX.Dialogs, FMX.StdCtrls,
FMX.Controls.Presentation;
type
TForm1 = class(TForm)
Button1: TButton;
Button2: TButton;
ProgressBar1: TProgressBar;
Button3: TButton;
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
procedure Button3Click(Sender: TObject);
private
procedure Test;
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
uses
System.Threading;
{$R *.fmx}
procedure TForm1.Button1Click(Sender: TObject);
begin
Test;
end;
procedure TForm1.Button2Click(Sender: TObject);
begin
TTask.Run(
Test
);
end;
procedure TForm1.Button3Click(Sender: TObject);
begin
ProgressBar1.Value := 0;
end;
procedure TForm1.Test;
const
n = 200;
var
I: Integer;
begin
ProgressBar1.Min := 0;
ProgressBar1.Max := n - 1;
for I := 0 to n - 1 do
begin
ProgressBar1.Value := I;
sleep(10);
end;
end;
end.
Ссылка на комментарий
8 ответов на этот вопрос
Рекомендуемые сообщения
Присоединяйтесь к обсуждению
Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.