Модератор: Модераторы
for i := 0 to 100 do
begin
label1.caption := IntToStr(i);
Application.ProcessMessages;
end;
var
t : qword;
begin
...
t:=GetTickCount64;
for i := 0 to 100 do
begin
label1.caption := IntToStr(i);
if GetTickCount64 - t > 50 then begin
Application.ProcessMessages;
t:=GetTickCount64;
end;
end;
на каждой итерации промежуточные значения переменных отображались на Label? Добавляю их в Мемо - все ок (добавляются по мере выполнения цикла)
label1.Text := label1.Text + InttoStr(i)+';'
скалогрыз писал(а):ускорим цикл чуток
procedure TForm1.Button1Click(Sender: TObject);
var
MyThr: TMyThr;
begin
Button1.Enabled:= False;
MyThr:= TMyThr.Create(True);
try
while not MyThr.Finished do
begin
Application.ProcessMessages;
end;
finally
FreeAndNil(MyThr);
Button1.Enabled:= True;
end;
end;
{ TMyThr }
procedure TMyThr.ShowCounter;
begin
Form1.Label1.Caption:= Format('Текущее значение счетчика: %d',[FCnt]);
end;
procedure TMyThr.Execute;
begin
while FCnt < 100 do
begin
FCnt:= FCnt + 1;
Synchronize(@ShowCounter);
Sleep(50);
end;
end;
constructor TMyThr.Create(CreateSuspended: Boolean);
begin
Inherited Create(CreateSuspended);
FreeOnTerminate:= False;
Priority:= tpLower;
FCnt:= 0;
if CreateSuspended then Start;
end;
procedure TMyThr.Execute;
begin
while FCnt < 100 do
begin
FCnt:= FCnt + 1;
Synchronize(@ShowCounter);
Sleep(50);
end;
end;
olegy123 писал(а):Application.ProcessMessages; - для линивых и новичков и рукожопых..
zoltanleo писал(а):Попробуй в моем коде выше убрать ProcessMessages из главного потока.
olegy123 писал(а):Synchronize это способ правильно разрулить и развести когда есть необходимость влезть в сферу главного потока. Принудительно вызывать в нем Application.ProcessMessages - это неправильно.
Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 25