Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Как работать с длительными процессами в программе?


Voproshay ©   (2007-07-04 05:15:00) 

Под длительными процесами я подразумеваю, например, сканирование файлов на диске, сканирование сети, поиск в больших массивах. Т.е. операции, которые могут длиться и минуту и час, и более, короче длительность их неизвестна.
Чем пользоваться? Циклами или, может быть, таймером? Или есть какие-то другие способы?
Например:
while i<s do
begin
 //а тут выполняемые действия
end;


или вот так?

procedure TForm1.Timer1Timer(Sender: TObject);
begin
//а тут выполняемые действия
end;


Сергей М.   (2007-07-05 10:02:00) [1]


> Хотелось бы чтоб пользователь имел возможность работать
> во время выполнения  "длительного процесса"


Ну так вставь упомянутую строчку в тот самый цикл - и всех делов.

Чем чаще эта строчка будет получать управление, тем быстрее твоя программа будет реагировать на действия юзера.


Voproshay   (2007-07-05 10:00:00) [2]

Хотелось бы чтоб пользователь имел возможность работать во время выполнения  "длительного процесса"


Сергей М.   (2007-07-05 09:06:00) [3]


> Voproshay   (05.07.07 07:30) [4]


В твоем вопросе не прозвучало, чтотебя беспокоит в этих самых "длительных процессах". Ну длительные они, ну и что ? Программа что ли "зависает" ? Вставь в тело цикла одну-единственную строчку Application.ProcessMessages - и все ! И программа "оживет" ! И никаких потоков не требуется, тем более что ты "не в курсе что это и зачем", и тем более что "нормальный" рассказ о потоках - это отнюдь не десяток строк текста, а приличная по объему книжная глава.


Voproshay   (2007-07-05 07:30:00) [4]

Извините, а вы можете привести простенький пример работы с потоками?
Я ни разу не пользовался, вообще не в курсе что это и зачем. Думаю, что на форуме найдётся много начинающих, которым, как и мне, будет интересна и полезна эта информация. А также на форуме найдётся достаточное количество профессионалов, способных нормально объяснить о потоках.


{RASkov}   (2007-07-04 05:34:00) [5]

> Только таймер я не знаю зачем.

В самом деле, чет я с таймером погорячился.... тот же цикл получился, только медленнее... :)


AlexanderMS   (2007-07-04 05:31:00) [6]


> Voproshay   (04.07.07 05:15)  

Что подходит, тем и пользуйтесь. Можно ещё потоки создавать, если, пока идёт длительный процесс, пользователь не должен терять возможность нормально работать с программой.

Только таймер я не знаю зачем.


{RASkov}   (2007-07-04 05:30:00) [7]

TThread?Но может вполне подойти и Таймер.... смотря какая задача...
Например с Таймером можно так:

procedure StartTimer;
begin
 Timer1.Tag:=0;
 Timer1.Enabled:=True;
end;

procedure TForm1.Timer1Timer(Sender: TObject);
begin
 //а тут выполняемые действия
 if Timer1.Tag>=List.Count then begin Timer1.Enabled:=False; Exit; end;
 Работаем с элементом - List[Timer1.Tag]
 Inc(Timer1.Tag);
end;


List.Add(); - Добавляем элемент(ы)
StartTimer; - Стратуем таймер.

Где List чисто для примера, может быть чем угодно, хоть массивом..... алгоритм измениться в зависимости от задачи...
Но программа будет "тормозить" на момент выполнения Таймер1Таймер, так как его код выполняется в основном потоке, в отличии от TThread...


Наверх

Титульная страница Поиск, карта сайта Написать письмо