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

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

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

Восстановить пароль
Повторная активизация e-mail

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

Ответ
 
Опции темы Поиск в этой теме
Старый 10.12.2009, 21:32   #1
prizrak1390
-=PriZraK=-
Форумчанин
 
Аватар для prizrak1390
 
Регистрация: 12.12.2007
Сообщений: 399
Печаль Оптимизация функции...

Доброе время суток!

Помогите пожалуйста оптимизировать код данной функции. С её помощью файл разбивается на "куски" определённого размера. Я собираю прогу в которой одновременно можно "резать" больше 1-го файла. Но вот незадача...стоит начать "резать" этой функцией файл, как прога уже не отвечает. Я уже как мог экспериментировал с application.processmessages...не помогает. Пожалуйста, подскажите, как "разморозить" прогу во время выполнения одной или нескольких таких функций?

Код:
function SplitFile(FileName : TFileName; SizeofFiles : Integer; ProgressBar : TProgressBar) : Boolean;
var
i : Word;
fs, sStream: TFileStream;
SplitFileName: String;
begin
ProgressBar.Position := 0;
fs := TFileStream.Create(FileName, fmOpenRead or fmShareDenyWrite);
try
  for i := 1 to Trunc(fs.Size / SizeofFiles) + 1 do
  begin
    SplitFileName := ChangeFileExt(FileName, '.'+ FormatFloat('000', i));
    sStream := TFileStream.Create(SplitFileName, fmCreate or fmShareExclusive);
     try
       if fs.Size - fs.Position < SizeofFiles then
         SizeofFiles := fs.Size - fs.Position;
       sStream.CopyFrom(fs, SizeofFiles);
       ProgressBar.Position := Round((fs.Position / fs.Size) * 100);
     finally
       sStream.Free;
     end;
   end;
finally
   fs.Free;
end;
 
end;
Спасибо.

Последний раз редактировалось prizrak1390; 10.12.2009 в 21:57. Причина: Ступил.... XD
prizrak1390 вне форума Ответить с цитированием
Старый 10.12.2009, 22:04   #2
mihali4
*
Старожил
 
Регистрация: 22.11.2006
Сообщений: 9,201
По умолчанию

Странно...
Всегда помогало (да и просто необходимо для отображения хода операции)
Код:
ProgressBar.Position := Round((fs.Position / fs.Size) * 100);
Application.ProcessMessages;
mihali4 вне форума Ответить с цитированием
Старый 10.12.2009, 22:14   #3
prizrak1390
-=PriZraK=-
Форумчанин
 
Аватар для prizrak1390
 
Регистрация: 12.12.2007
Сообщений: 399
По умолчанию

mihali4, да ладно уже с отображением прогресса. Я пробовал и Ваш вариант. Дошло до того, что почти после КАЖДОЙ строчки поставил application.processmessages...но что бы Вы думали? Файл режется, прогресс отображается...но прога висит. И процесс отображается лишь, когда создан новый "кусок". И в такой момент прога на одну секунду "отмерзает". Но потом опять анабиоз...
prizrak1390 вне форума Ответить с цитированием
Старый 10.12.2009, 22:35   #4
mihali4
*
Старожил
 
Регистрация: 22.11.2006
Сообщений: 9,201
По умолчанию

Так пройдитесь по шагам и посмотрите, на какой строке у вас "морозит"...
mihali4 вне форума Ответить с цитированием
Старый 10.12.2009, 22:48   #5
prizrak1390
-=PriZraK=-
Форумчанин
 
Аватар для prizrak1390
 
Регистрация: 12.12.2007
Сообщений: 399
По умолчанию

Ну тут в глаза бросается:
Код:
 sStream.CopyFrom(fs, SizeofFiles);
Пробовал эту строку из кода убрать. Прога перестала "замерзать"..А как решить проблему?
prizrak1390 вне форума Ответить с цитированием
Старый 10.12.2009, 22:55   #6
SNUPY
Форумчанин
 
Регистрация: 15.02.2008
Сообщений: 621
По умолчанию

prizrak1390, а почему бы вам эту ф-ию не запускать в отдельной нити (TThread помоему так пишеться)???? И Замараживаться перестанет =)
Помог? Ну так нажми на весы!
SNUPY вне форума Ответить с цитированием
Старый 10.12.2009, 22:57   #7
BOBAH13
Android Developer
Старожил Подтвердите свой е-майл
 
Аватар для BOBAH13
 
Регистрация: 19.02.2007
Сообщений: 3,708
По умолчанию

Цитата:
Сообщение от prizrak1390 Посмотреть сообщение
Ну тут в глаза бросается:
Код:
 sStream.CopyFrom(fs, SizeofFiles);
Пробовал эту строку из кода убрать. Прога перестала "замерзать"..А как решить проблему?
Если память не подводит, это TStream, а CopyFrom, это функция перегонки данных (байт) из одной части в другую (будь то память файл и т.п.), т.е. ручками читаем и пишем например порциями в 1024 байта, и в это же время вызываем Application.ProcessMessages.
BOBAH13 вне форума Ответить с цитированием
Старый 10.12.2009, 23:13   #8
prizrak1390
-=PriZraK=-
Форумчанин
 
Аватар для prizrak1390
 
Регистрация: 12.12.2007
Сообщений: 399
По умолчанию

SNUPYуже думал об этом. Но хочется, как можно проще код сделать... Спасибо.

BOBAH13
То есть использовать blockread и blockwrite? Я не очень силен в этом. Помогите реализовать... А то я чую в дебри полезу..Ну или хоть дайте почитать нужную литературу...
prizrak1390 вне форума Ответить с цитированием
Старый 10.12.2009, 23:23   #9
SNUPY
Форумчанин
 
Регистрация: 15.02.2008
Сообщений: 621
По умолчанию

Замени sStream.CopyFrom(fs, SizeofFiles);
на это
Код:
  while SizeofFiles>BlockSize do
  begin
    sStream.CopyFrom(fs,BlockSize);
    SizeofFiles:=SizeofFiles-BlockSize;
  end;
  sStream.CopyFrom(fs, SizeofFiles);
нуу типо меньшими блоками будет копировать =)))
Помог? Ну так нажми на весы!
SNUPY вне форума Ответить с цитированием
Старый 10.12.2009, 23:29   #10
prizrak1390
-=PriZraK=-
Форумчанин
 
Аватар для prizrak1390
 
Регистрация: 12.12.2007
Сообщений: 399
По умолчанию

SNUPY,сейчас попробуемс

----

Вообщем...попробовал. Провел пару экспериментов даже, эффекта нету :'( Но за помощь все равно спасибо.

Последний раз редактировалось prizrak1390; 10.12.2009 в 23:37.
prizrak1390 вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Оптимизация Viper1287 Операционные системы общие вопросы 7 13.09.2009 15:33
Оптимизация Flangini Microsoft Office Excel 5 11.06.2009 11:48
Запуск процедуры из процедуры с дополнением 1sal1 Общие вопросы Delphi 3 06.10.2008 21:54
Оптимизация кода. MAKTECYMA Общие вопросы C/C++ 2 05.06.2008 16:48
Оптимизация Terran Общие вопросы Delphi 3 03.05.2008 19:03