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, результат тот же. Может, кто знает - как сделать цикл без подвисания программы?


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]

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


Страницы:   1 2

Наверх

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