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

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

Программа подвисает при запуске цикла [D5, 2003]


Страницы:   1 2

djkondakov ©   (2009-04-23 15:34:00) 

Требуется написать программу, которая копирует файлы, пути к которым записаны в TListBox'е, в новое место. Я хотел сделать по старинке, как в Паскале - цикл по записям в списке, а внутри его - цикл по байтам файла. Однако при запуске копирования программа перестает отвечать, и "висит" вплоть до окончания копирования. Пробовал использовать CopyFrom и TTimer, результат тот же. Может, кто знает - как сделать цикл без подвисания программы?


Anatoly Podgoretsky   (2009-04-23 18:52:00) [1]


> Да, это основная цель программы. Пользователь должен видеть
> прогресс, ему должно сообщаться, сколько из скольки файлов
> скопировано.

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


Anatoly Podgoretsky   (2009-04-23 18:49:00) [2]

> Сергей М.  (23.04.2009 17:07:20)  [20]

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


djkondakov   (2009-04-23 18:08:00) [3]

Ясно, буду разбираться... Всем спасибо, если что, буду спрашивать здесь.


Ганя   (2009-04-23 17:50:00) [4]


> Да, это основная цель программы. Пользователь должен видеть
> прогресс, ему должно сообщаться, сколько из скольки файлов
> скопировано.

Да, при таком раскладе городить огород с потоками не имеет смысла, присоединяюсь к [28]


Сергей М.   (2009-04-23 17:36:00) [5]

Следует, к примеру, вызвать Application.ProcessMessages.

Сделать это можно в колбэк-функции при использовании CopyFileEx или в теле перекрытого TFileStream.Read (cм. [14])


AndreyV   (2009-04-23 17:36:00) [6]

> [26] djkondakov   (23.04.09 17:28)
> А как ей, собсно, дать это время? Может, попробовать в цикл
> sleep запихать?

Ты ответы читал, особенно [4]?


djkondakov   (2009-04-23 17:28:00) [7]

А как ей, собсно, дать это время? Может, попробовать в цикл sleep запихать?


Сергей М.   (2009-04-23 17:25:00) [8]


> при копировании у программы не остается времени на отрисовку
> оконных элементов


Так ты сам не даешь ей это время, потому и не отрисовывает)


djkondakov   (2009-04-23 17:22:00) [9]

Индикацию прогресса я как раз сделать не могу, т.к. при копировании у программы не остается времени на отрисовку оконных элементов.


djkondakov   (2009-04-23 17:19:00) [10]

Да, это основная цель программы. Пользователь должен видеть прогресс, ему должно сообщаться, сколько из скольки файлов скопировано.


Ганя   (2009-04-23 17:18:00) [11]

Копирование файлов - это основная цель программы? Может ли пользователь продолжать работать в программе, пока файлы копируются, или он должен ждать результатов, и максимум, что ему может быть позволено - отменить процесс копирования?


Сергей М.   (2009-04-23 17:10:00) [12]


> точно также как запись кусками с потомщью TFileStream


Здесь хотя бы размеры копируемых порций можно контролировать, в отличие от CopyFileEx


Сергей М.   (2009-04-23 17:07:00) [13]


> Anatoly Podgoretsky ©   (23.04.09 17:02) [18]


Толку-то от колбэка ?

Вызвавший ф-цию код все равно будет "висеть" до фактического окончания копирования..

Да и колбек будет вызываться с частотой, определяемой системой, а не с той с которой было бы желательно для своевременной обработки оконных сообщений


Anatoly Podgoretsky   (2009-04-23 17:03:00) [14]

> Медвежонок Пятачок  (23.04.2009 17:01:17)  [17]

Надежда есть - кусок кода один раз привел.


Anatoly Podgoretsky   (2009-04-23 17:02:00) [15]

> Сергей М.  (23.04.2009 16:44:15)  [15]

Не забывай про функцию обратного вызова, поэтому полублокирующая, точно также как запись кусками с потомщью TFileStream


Медвежонок Пятачок   (2009-04-23 17:01:00) [16]

тяжелый случай .....


djkondakov   (2009-04-23 16:58:00) [17]

С циклами виснет, хотя файлы копируются. Скрин не могу выложить, т.к. не могу его сделать. Если во время работы переключиться в другое окно, то на поверхности окна программы остается кусок текущего окна. Передвигать по экрану окно программы нельзя.


Сергей М.   (2009-04-23 16:44:00) [18]


> Anatoly Podgoretsky ©   (23.04.09 16:42) [13]


> CopyFileEx


Она, если не ошибаюсь, такая же блокирующая как и CopyFile


Сергей М.   (2009-04-23 16:43:00) [19]


> Делаю обратно циклы


Не надо ни "обратно" ни вновь)

Можно и без явных циклов обойтись - он ужеесть, только неявный.
Все что нужно - сделать свой наследник TFileStream и в нем перекрыть, например,  метод Read.

В теле перекрытого метода ограничивать размер запрашиваемых к чтению блоков, например, 4-мя килобайтами. После чтения очередного блока тут же вызывать Application.ProcessMessages.


Anatoly Podgoretsky   (2009-04-23 16:42:00) [20]

> djkondakov  (23.04.2009 16:27:12)  [12]

Не надо делать циклы, по крайней мере по байтам, смотри в сторону shFileOperation или в крайнем случае в сторону CopyFileEx


Страницы:   1 2

Наверх

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