![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Программа подвисает при запуске цикла [D5, 2003]
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