Я использовал Delphi много лет назад, я помню, что в версии 7, и даже тогда у меня не было много знаний, я работал с C++ с тех пор, и сейчас я работаю в компании, использующей Delphi XE10 и понял, что поиск я нашел много случайных вещей разностных версий, и это меня немного смущает.Обновление темы GUI
Я играю в темы, и я хотел обновить графический интерфейс и поиск, я нашел Synchronize
и способ, которым он работает, показывает, какое влияние оно оказывает на производительность, вы можете заметить, что приложение замерзает.
Мне было интересно, есть ли более плавный способ справиться с этим, что-то вроде событий, уведомлений или чего-то еще?
@edit
unit WriterThreadUnit;
interface
uses
System.Classes, System.SysUtils, Unit1;
type
TWriterThread = class(TThread)
private
linesToPrint: integer;
fileDirectory: string;
function generateFilename(): string;
procedure write();
protected
procedure Execute; override;
public
constructor Create
(
const createSuspended: boolean;
const linesToPrint: integer;
fileDirectory: string
);
end;
implementation
{ TWriterThread }
constructor TWriterThread.Create
(
const createSuspended: boolean;
const linesToPrint: integer;
fileDirectory: string
);
begin
Self.linesToPrint := linesToPrint;
Self.fileDirectory := fileDirectory;
Self.FreeOnTerminate := true;
inherited Create(CreateSuspended);
end;
procedure TWriterThread.Execute;
begin
inherited;
write;
end;
function TWriterThread.generateFilename: string;
begin
Result := Format('%s\%s_total_lines_%d.txt',
[
Self.fileDirectory,
FormatDateTime('hh-mm-ss-zzz', Now),
self.linesToPrint
]
);
end;
procedure TWriterThread.write;
var
fileLines: TStringList;
i: integer;
filename: string;
begin
fileLines := TStringList.Create;
filename := generateFilename;
try
for I := 1 to Self.linesToPrint do
begin
Synchronize(
procedure
begin
Form1.Memo1.Lines.Add('Writing: ' + IntToStr(I) + ' to ' + generateFilename);
end
);
fileLines.Add(Format('Line number: %d', [i]));
Sleep(1);
end;
fileLines.SaveToFile(filename);
finally
fileLines.Free;
end;
end;
end.
Возможно, вы используете 'Synchronize' неправильно. Процедура «Синхронизированная» должна работать немного - просто обновите интерфейс в основном потоке. Покажите вам код, пожалуйста. Конечно, есть много других способов, с событиями и т. Д. – MBo
@MBo Отредактировано кодом потока. – daitouvi
Мне любопытно, почему вы обновляете заметку с каждой итерацией? Это делает поток бессмысленным .. держите поток в фоновом режиме и обновляйте как можно меньше. –