Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 28.05.2011, 21:26   #1
Человек_Борща
Старожил
 
Аватар для Человек_Борща
 
Регистрация: 30.12.2009
Сообщений: 11,434
По умолчанию Копирование n файлов через поток. Проблема

Доброго времени суток!

Значит ситуация такая:
Имеется функция:
Код:
procedure FastFileCopy(aInFile, aOutFile: string; CallBackProc: TCallBack);
const
  BuffSize = 3 * 4 * 4096; // 48 kb
var
  Buff: array [1 .. BuffSize] of Byte;
  InFile, OutFile: TFileStream;
  fSize: Int64; // Размер файла
  fPosition: Integer; // текущаяя позиция
  cSize: Int64; // Размер копированых данных
begin
  // Если имена не совпадают
  If not(aInFile <> aOutFile) then
  begin
    MessageBox(Application.Handle,
      'Пути входного и выходного файлов совпадают! Копирование невозможно!',
      'Внимание!', MB_OK or MB_ICONWARNING);
    Exit;
  end;
  // Открываем для чтения
  InFile := TFileStream.Create(aInFile, fmOpenRead);
  // открываем(создаём) для записи
  OutFile := TFileStream.Create(aOutFile, fmCreate or fmOpenWrite);
  try
    // начинаем с начала
    InFile.Seek(0, soFromBeginning);
    OutFile.Seek(0, soFromBeginning);
    // размер файла
    fSize := InFile.Size;
    // позиция 0
    fPosition := 0;
    repeat
      // копируем блок данных  в буфер
      cSize := InFile.Read(Buff, BuffSize);
      // увелечиваем позицию на размер копированного блока
      Inc(fPosition, cSize);
      // перадаём в обратный вызов
      CallBackProc(fPosition, fSize);
      // пишем из буфера
      OutFile.Write(Buff, BuffSize);
    until cSize < BuffSize;
  finally
    FreeAndNil(InFile);
    FreeAndNil(OutFile);
  end;
end;
которая из одной папки, копирует файлы в другую.
Вся соль в том что когда копируются файлы n GB
программа намертво виснет.

Решил запихать все это дело в TThread что успешно получилось. С одним файлом теперь все нормально и все копируется.

Но если несколько файлов, то опять же все виснет. т.к. все потоки запускаются одновременно.

Как их поставить в очередь?
Чтобы цикл не продолжил работу пака поток не завершит работу?
Человек_Борща вне форума Ответить с цитированием
Старый 28.05.2011, 22:12   #2
Leo08
Delphi master
Пользователь
 
Аватар для Leo08
 
Регистрация: 28.05.2011
Сообщений: 96
По умолчанию

А зачем так усложнять задачу?
Пишешь:
Код:
Var
F:tmemorystream;
Input,output:string;
Begin
Input:='1.txt';
Output:='2.txt';
F:=tmemorystream.create;
F.loadfromfile(input);
F.savetofile(output);
F.free;
End;
A для нескольких файлов можешь этот код впихнуть в процедуру и в самой программе воспользоваться оператором цикла for.
БЯЯЯГГАААААА

Последний раз редактировалось Leo08; 28.05.2011 в 22:14.
Leo08 вне форума Ответить с цитированием
Старый 28.05.2011, 22:45   #3
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

Запустить поток синхронно,потом следующий и т.д. В коде запуск потока с ожиданием завершения
Код:
Thread.Resume;
while not Thread.Terminated do Application.ProcessMessages;
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 28.05.2011, 23:14   #4
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

Цитата:
А зачем так усложнять задачу?
а скопируйте ка мне файлик 4ГБ таким методом?(на 32-битке причем)
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 29.05.2011, 01:55   #5
Человек_Борща
Старожил
 
Аватар для Человек_Борща
 
Регистрация: 30.12.2009
Сообщений: 11,434
По умолчанию

Пока вернулся к старому варианту(без потоков).

Согласен с Пеполом Феникса.
В моём коде идет корпирование блокам данных, размером 48 кб(Для меня это с верхом(файлов более 200 метров не будет уж точно)).

В вашем случае в Tstream летит сразу весь файл(а это огого сколько времени).
За это время я своим методом перемещу уже половину файла(а то и больше, если буфер увеличить).
Человек_Борща вне форума Ответить с цитированием
Старый 29.05.2011, 05:57   #6
veniside
Старожил
 
Регистрация: 03.01.2011
Сообщений: 2,508
По умолчанию

Цитата:
fSize: Int64; // Размер файла
fPosition: Integer; // текущаяя позиция
а чем позиция хуже размера? почему ей только 32 бита дали? )

> все виснет. т.к. все потоки запускаются одновременно

нечему там виснуть. хоть 50 потоков запусти. в CallBackProc что происходит?

> Как их поставить в очередь?

не знаю, зачем это надо, но перед выходом из FastFileCopy() запускай новый поток и всё.
"Когда приходит положенное время, человек перестаёт играть в пинбол. Только и всего."
veniside вне форума Ответить с цитированием
Старый 29.05.2011, 09:22   #7
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

Цитата:
В вашем случае в Tstream летит сразу весь файл(а это огого сколько времени).
За это время я своим методом перемещу уже половину файла(а то и больше, если буфер увеличить).
я вообще то имел в виду что весь файл в память то не влезет.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Чтение из файла через поток tim91 Общие вопросы Delphi 3 02.03.2011 09:35
Проблема с открытием файлов через макрос choky Microsoft Office Excel 5 31.12.2009 19:34
Скоростное копирование файлов через RAM 3D Hunter Общие вопросы Delphi 9 03.07.2009 19:41
Копирование файлов через http протокол Serega_P Работа с сетью в Delphi 3 06.12.2008 14:35
поток файлов мандарин Общие вопросы Delphi 1 24.04.2007 12:20