![]() |
|
|
Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
![]() |
|
Опции темы | Поиск в этой теме | Опции просмотра |
#16
|
||||
|
||||
![]() Вот немного доделал, теперь выполняется
Код:
procedure TMainTestForm.InThreadProc(var NextPos: Integer; var ATerminate: Boolean); begin Sleep(500); // здесь делаем необходимые операции Inc(NextPos, Random(15)); // обновляем позицию ATerminate := (NextPos > 100);// если все сделали прекращаем end; Последний раз редактировалось s0Creator, 29.01.2010 в 09:33. Причина: немного поправил вложение |
#17
|
||||
|
||||
![]() А нельзя сие реализовать так, как начал я (через While ... do... position:=position+random(a); ), только с использованием потоков?
|
#18
|
||||
|
||||
![]() Цитата:
Inc(FPos, random(15)); это аналог FPos := FPos + random(15); И т.к. работу с визуальными компонентами из потока надо синхронизировать выделен метод Код:
procedure TNewThead.SetPos; begin Form1.ProgressBar1.Position := FPos; FPos := Form1.ProgressBar1.Position; end; метод 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); Последний раз редактировалось s0Creator, 29.01.2010 в 09:45. |