Цитата:
Сообщение от Chuwis720
А нельзя сие реализовать так, как начал я (через While ... do... position:=position+random(a); ), только с использованием потоков?
|
Смотри код в сообщении
№ 13
Inc(FPos, random(15)); это аналог
FPos := FPos + random(15);
И т.к. работу с визуальными компонентами из потока надо синхронизировать выделен метод
Код:
procedure TNewThead.SetPos;
begin
Form1.ProgressBar1.Position := FPos;
FPos := Form1.ProgressBar1.Position;
end;
Да и в сообщении
№16
метод
TMainTestForm.InThreadProc выполняется в потоке в цикле и
ATerminate := (NextPos > 100); можно считать аналогом While
Вообще прикрепленный к сообщению №16 проект сделан универсальным.
Достаточно в любой проект скопировать модули
UProgressForm и
UProgressThread.
Создать в любой форме метод
Код:
procedure InThreadProc(var NextPos: Integer; var ATerminate: Boolean);
и запустить его командой
TProgressForm.ShowInThreadProc('Заголовок', 'Сообщение', InThreadProc, Self)
Он будет циклически выполняться в отдельной нити пока
ATerminate не присвоить
True.
При этом в модальном окне
TProgressForm будет отображаться прогресс выполнения, задаваемый
NextPos.
Вид модального окна конечно можно менять.
Нашел еще одну недопечатку - перезалил
Код:
procedure TProgressThread.Execute;
//...
if needTerminate then
Terminate
else
Synchronize(SetPos);