Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > [ "Начинающим" ]
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #16  
Старый 28.01.2010, 11:43
Аватар для s0Creator
s0Creator s0Creator вне форума
Местный
 
Регистрация: 20.02.2008
Адрес: Московская область
Сообщения: 420
Репутация: 884
По умолчанию

Вот немного доделал, теперь выполняется
Код:
procedure TMainTestForm.InThreadProc(var NextPos: Integer;
  var ATerminate: Boolean);
begin
  Sleep(500);  // здесь делаем необходимые операции
  Inc(NextPos, Random(15)); // обновляем позицию
  ATerminate := (NextPos > 100);// если все сделали прекращаем
end;
с показом прогресса в отдельном окне пока не будет все сделано или прервано.
Вложения
Тип файла: zip ProgressThread.zip (4.3 Кбайт, 16 просмотров)

Последний раз редактировалось s0Creator, 29.01.2010 в 09:33. Причина: немного поправил вложение
Ответить с цитированием
  #17  
Старый 28.01.2010, 16:34
Аватар для Chuwis720
Chuwis720 Chuwis720 вне форума
Прохожий
 
Регистрация: 22.09.2009
Сообщения: 28
Репутация: 10
По умолчанию

А нельзя сие реализовать так, как начал я (через While ... do... position:=position+random(a); ), только с использованием потоков?
Ответить с цитированием
  #18  
Старый 29.01.2010, 08:17
Аватар для s0Creator
s0Creator s0Creator вне форума
Местный
 
Регистрация: 20.02.2008
Адрес: Московская область
Сообщения: 420
Репутация: 884
По умолчанию

Цитата:
Сообщение от 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);

Последний раз редактировалось s0Creator, 29.01.2010 в 09:45.
Ответить с цитированием
Ответ


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 03:06.


 

Сайт

Форум

FAQ

Соглашения

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2025