![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Программа подвисает при запуске цикла [D5, 2003]
djkondakov © (2009-04-23 15:34:00)Требуется написать программу, которая копирует файлы, пути к которым записаны в TListBox'е, в новое место. Я хотел сделать по старинке, как в Паскале - цикл по записям в списке, а внутри его - цикл по байтам файла. Однако при запуске копирования программа перестает отвечать, и "висит" вплоть до окончания копирования. Пробовал использовать CopyFrom и TTimer, результат тот же. Может, кто знает - как сделать цикл без подвисания программы?
djkondakov (2009-04-23 16:27:00) [21]Понятно. Делаю обратно циклы.
Медвежонок Пятачок (2009-04-23 16:25:00) [22]В итоге ничего не изменилось.
сын: - Папа, почему солнце всегда восходит на востоке, а заходит на западе?
папа-программист: - Это точно?
- Ага!
- Проверял?
- Проверял!!!
- Ничего не трогай, пусть так и работает!
Anatoly Podgoretsky (2009-04-23 16:21:00) [23]> djkondakov (23.04.2009 16:18:09) [9]
Изменилось и еще как - ты сделал "зависание".
djkondakov (2009-04-23 16:18:00) [24]Цикл по байтам я убрал, когда бился с "зависанием". В итоге ничего не изменилось.
Anatoly Podgoretsky (2009-04-23 16:15:00) [25]> djkondakov (23.04.2009 16:13:07) [7]
Ну и где же тут цикл по байтам?
djkondakov (2009-04-23 16:13:00) [26]Угу, принимайте.
procedure TForm1.Button7Click(Sender: TObject);
var stream1, stream2: TFileStream;
i: integer;
begin
if edit1.Text<>'' then
timer1.Enabled:=true
else showmessage('Не указана папка назначения!');
end;
procedure TForm1.Timer1Timer(Sender: TObject);
var stream1, stream2: TFileStream;
i: integer;
begin
if i<=listbox1.Items.Count-1 then begin
try
stream1:=tfilestream.create(listbox2.items[i], fmopenread);
stream2:=tfilestream.create(edit1.text+listbox1.items[i], fmcreate);
stream2.seek(0,sofromend);
stream2.CopyFrom(stream1, stream1.size);
finally
stream1.free;
stream2.free;
end;
i:=i+1;
end else begin
timer1.Enabled:=false;
showmessage('Копирование завершено');
end;
end;
Вот. Пояснение - в ListBox1 хранятся имена файлов без пути, а в ListBox2 - полные имена, с путями.
Anatoly Podgoretsky (2009-04-23 15:59:00) [27]Лучшее - shFileOperation
Потоки вообще не нужны при указаном тобой алгоритме, обновлять можно хоть через байт, а ты видимо ни разу.
Код давай.
Сергей М. (2009-04-23 15:54:00) [28]Можно и без доп.потоков.
Но это лишь уменьшит эффект "зависания", но избавит от него совсем.
djkondakov (2009-04-23 15:51:00) [29]А без использования потоков никак нельзя? Просто я еще не очень-то в них...
stas (2009-04-23 15:43:00) [30]Паралельный поток создавайте.
копировать файлы можно с помощью функции- Copyfile
Медвежонок Пятачок (2009-04-23 15:38:00) [31]она не подвисает.
Сергей М. (2009-04-23 15:38:00) [32]Вынести логику копирования в доп.код.поток, ибо за интерактив отвечает главный поток