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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 29.09.2010, 16:17   #1
flug
Пользователь
 
Регистрация: 23.07.2009
Сообщений: 48
По умолчанию Замораживается приложение

Всем доброго времени суток!
Я нашёл в инете код копирования файлов с прогресс баром, и этот код решил запихнуть в dll, в основном приложении кидаю progressbar на форму и управляю им из dll посылая ему сообщения, так вот вопрос в том почему пока копируется файл замораживается основное приложени, и что с этим делать. Может как-то CallBack испоьзовать надо, правда не пойму как. Вот код копирования файлов который я запихнул в длл.
Код:
type
  TCallBack = procedure(Position, Size: Longint);

procedure FastFileCopy(const InFileName, OutFileName: string;
  CallBack: TCallBack);


implementation
{$R *.dfm}

procedure FastFileCopyCallBack(Position, Size: Longint);
begin
  Form1.ProgressBar1.Max := Size;
  Form1.ProgressBar1.Position := Position;
end; 

procedure FastFileCopy(const InFileName, OutFileName: string; 
  CallBack: TCallBack);
const 
  BufSize = 3 * 4 * 4096;
type
  PBuffer = ^TBuffer; 
  TBuffer = array[1..BufSize] of Byte; 
var
  Size: DWORD; 
  Buffer: PBuffer; 
  infile, outfile: file;
  SizeDone, SizeFile: LongInt; 
begin 
  if (InFileName <> OutFileName) then
  begin 
    buffer := nil; 
    Assign(infile, InFileName);
    Reset(infile, 1); 
    try 
      SizeFile := FileSize(infile);
      Assign(outfile, OutFileName); 
      Rewrite(outfile, 1); 
      try
        SizeDone := 0; 
        New(Buffer); 
        repeat
          BlockRead(infile, Buffer^, BufSize, Size); 
          Inc(SizeDone, Size);
          CallBack(SizeDone, SizeFile); 
          BlockWrite(outfile, Buffer^, Size)
        until Size < BufSize; 
        FileSetDate(TFileRec(outfile).Handle,
        FileGetDate(TFileRec(infile).Handle)); 
      finally
        if Buffer <> nil then 
          Dispose(Buffer);
        CloseFile(outfile) 
      end;
    finally 
      CloseFile(infile);
    end; 
  end
  else 
    raise EInOutError.Create('File cannot be copied onto itself')
end; {FastFileCopy}

Последний раз редактировалось flug; 29.09.2010 в 16:20.
flug вне форума Ответить с цитированием
Старый 29.09.2010, 16:31   #2
_SERGEYX_
Участник клуба
 
Аватар для _SERGEYX_
 
Регистрация: 07.07.2007
Сообщений: 1,518
По умолчанию

Цитата:
пока копируется файл замораживается основное приложени, и что с этим делать
Навскидку, может Application.ProcessMessages вписать?
_SERGEYX_ вне форума Ответить с цитированием
Старый 29.09.2010, 16:47   #3
flug
Пользователь
 
Регистрация: 23.07.2009
Сообщений: 48
По умолчанию

_SERGEYX_
В главном приложении не помогает, а в dll Application.ProcessMessages вставить нельзя.
flug вне форума Ответить с цитированием
Старый 29.09.2010, 16:55   #4
evg_m
Старожил
 
Регистрация: 20.04.2008
Сообщений: 5,543
По умолчанию

Цитата:
в основном приложении кидаю progressbar на форму и управляю им из dll
Цитата:
Вот код копирования файлов который я запихнул в длл.
Зачем в DLL есть вот это?!
Цитата:
Код:
procedure FastFileCopyCallBack(Position, Size: Longint);
begin
  Form1.ProgressBar1.Max := Size;
  Form1.ProgressBar1.Position := Position;
end;
программа — запись алгоритма на языке понятном транслятору
evg_m вне форума Ответить с цитированием
Старый 29.09.2010, 22:38   #5
flug
Пользователь
 
Регистрация: 23.07.2009
Сообщений: 48
По умолчанию

evg_m
Сорри, это я по не внимательности оставил, а на самом деле в dll так:
Цитата:
procedure FastFileCopyCallBack(Position, Size: Longint);
begin
SendMessage(h, PBM_SETPOS, Position, 0);
end;
flug вне форума Ответить с цитированием
Старый 29.09.2010, 22:42   #6
evg_m
Старожил
 
Регистрация: 20.04.2008
Сообщений: 5,543
По умолчанию

поробуй
PostMessage(....);
программа — запись алгоритма на языке понятном транслятору
evg_m вне форума Ответить с цитированием
Старый 29.09.2010, 22:59   #7
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

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


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Задача:в вижуал с++ Разработать приложение-сервер и приложение (смотри дальше сообщение) Мила777 Фриланс 2 21.10.2009 11:05
Трехуровневое приложение EugeneIsmatulin Общие вопросы Delphi 2 19.06.2009 19:39
Консольное приложение Arkuz Общие вопросы Delphi 3 25.09.2008 23:59
Незакрываемое приложение One.Love Общие вопросы Delphi 25 27.02.2008 18:10
Создать приложение DOLBY Паскаль, Turbo Pascal, PascalABC.NET 8 28.01.2008 16:37