Мне сложно сказать не использовать Sleep
, поскольку я сам все время использую его, но Application.ProcessMessages
на самом деле опасное решение, особенно при использовании в цикле.Я не уверен, какую информацию вы отображаете (так как я не распознаю язык), но похоже, что вы делаете некоторые преобразования из Float в String.Хотя эти преобразования выполняются за доли секунды, сложите их все вместе, и вы можете выполнить длительную операцию.И предположим, что вы решили добавить еще одно значение для обновления, которое требует некоторых вычислений (например, байтов в секунду при передаче файла).Это преобразование добавит немного больше времени для этой операции, и, прежде чем вы узнаете об этом, вы можете получить обновление пользовательского интерфейса, которое занимает полсекунды (что кажется недолгим, но когда дело доходит до использования процессора, это довольнонагрузка).
Поэтому я бы предложил использовать поток для выполнения всех этих преобразований, вычислений и т. д. и инициировать события по мере необходимости при изменении этой информации.Безусловно, поток определенно будет немного сложнее, чем другие предлагаемые здесь решения.Но использование потока может также принести большую пользу.Вся ваша тяжелая работа может быть выполнена в фоновом режиме, в то время как ваше приложение по-прежнему реагирует идеально.Имейте в виду, что использование потока может быть очень сложным, особенно когда речь идет об обновлениях пользовательского интерфейса.
Есть несколько способов создать поток, но я постараюсь сделать это простым ...
type
TMyThread = class;
TMyThreadEvent = procedure(Sender: TObject; const Val1, Val2: String) of object;
TMyThread = class(TThread)
private
FValue1: Integer;
FValue2: Integer;
FString1: String;
FString2: String;
FOnChange: TMyThreadEvent;
procedure SYNC_OnChange;
protected
procedure Execute; override;
public
constructor Create;
property Value1: Integer read FValue1 write FValue1;
property Value2: Integer read FValue2 write FValue1;
property String1: String read FString1;
property String2: String read FString2;
property OnChange: TMyThreadEvent read FOnChange write FOnChange;
end;
...
constructor TMyThread.Create;
begin
inherited Create(False);
FValue1 := '0';
FValue2 := '0';
end;
procedure TMyThread.Execute;
var
S1, S2: String;
DoChange: Bool;
begin
DoChange:= False;
FValue2:= DoSomeBigCalculation(FValue1); //Some random big calculation
S1:= FormatFloat('#,##0.#', FValue1);
S2:= FormatFloat('#,##0.#', FValue2);
if (S1 <> FString1) then begin
FString1:= S1;
DoChange:= True;
end;
if (S2 <> FString2) then begin
FString2:= S2;
DoChange:= True;
end;
if DoChange then
Synchronize(SYNC_OnChange);
end;
procedure TMyThread.SYNC_OnChange;
begin
if assigned(FOnChange) then
FOnChange(Self, FString1, FString2);
end;
Теперь, чтобы использовать это, вы должны установить свойства Integer
по мере необходимости.Убедитесь, что для события OnChange
установлена процедура с параметрами указанного выше типа TMyThreadEvent
.Всякий раз, когда любое значение отличается от своего первоначального (или старого) значения, оно вызывает это событие.Я также настоятельно рекомендую поместить любой поток обработки, который может иметь эти значения, в первую очередь, в поток.Возможности многопоточности огромны и доказывают большое преимущество в приложениях, в которых много чего происходит.
Обратите внимание, что приведенный выше код является просто примером, напечатанным непосредственно на этом сайте, и не тестируется,Это просто чтобы дать вам представление о том, как реализовать поток для обновления.