Модератор: Модераторы
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 - это неправильно.
Сейчас этот форум просматривают: Yandex [Bot] и гости: 1