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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 10.12.2009, 23:42   #11
SNUPY
Форумчанин
 
Регистрация: 15.02.2008
Сообщений: 621
По умолчанию

А так:
Код:
while SizeofFiles>1024 do
  begin
    sStream.CopyFrom(fs,BlockSize);
    SizeofFiles:=SizeofFiles-1024;
    Application.ProcessMessages;
  end;
  sStream.CopyFrom(fs, SizeofFiles);
Если не поможет.... то прямая дорога к Thread =)))
Помог? Ну так нажми на весы!

Последний раз редактировалось mihali4; 10.12.2009 в 23:56.
SNUPY вне форума Ответить с цитированием
Старый 10.12.2009, 23:46   #12
prizrak1390
-=PriZraK=-
Форумчанин
 
Аватар для prizrak1390
 
Регистрация: 12.12.2007
Сообщений: 399
По умолчанию

SNUPY, ХА! именно ТАК щас и пробовал)))))))))))))) Реакции - NIL
А можешь показать реализацию в потоках? Вообще не хотелось бы к ним прибегать....
prizrak1390 вне форума Ответить с цитированием
Старый 10.12.2009, 23:52   #13
SNUPY
Форумчанин
 
Регистрация: 15.02.2008
Сообщений: 621
По умолчанию

грубо говоря код потока:

Код:
unit Unit2;

interface

uses
  Classes;

type
  Some_Thread = class(TThread)
  private
    { Private declarations }
  protected
    procedure Execute; override;
  end;

implementation

{ Important: Methods and properties of objects in visual components can only be
  used in a method called using Synchronize, for example,

      Synchronize(UpdateCaption);

  and UpdateCaption could look like,

    procedure Some_Thread.UpdateCaption;
    begin
      Form1.Caption := 'Updated in a thread';
    end; }

{ Some_Thread }
Procedure YourProcedure;
begin
//
end;

procedure Some_Thread.Execute;
begin
  FreeOnTerminate:=true;
  YourProcedure;
end;

end.
Если хочешь что бы в прогресс баре тикало, то надо создать в Главной форме процедуру которая будет прогресс в ПБ на одни квант прибавлять... потом в потоке при помощи синхранайз вызывать его =)))





КСТАТЕ!!!! А ты попробуйка для начала в своем случаи копировать в память, а потом из памяти на жесткий извлекай....
Помог? Ну так нажми на весы!

Последний раз редактировалось SNUPY; 10.12.2009 в 23:56.
SNUPY вне форума Ответить с цитированием
Старый 11.12.2009, 00:37   #14
SNUPY
Форумчанин
 
Регистрация: 15.02.2008
Сообщений: 621
По умолчанию

Вот это не грубый вариант потока =))) (только поленился сделать обновление прогресс бара):
Код:
unit Unit2;

interface

uses
  ComCtrls,Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;

type
  Some_Thread = class(TThread)
    constructor CreateThead(AFileName : String; ASizeofFiles : Integer;
      AProgressBar : TProgressBar);
  private
    FileName : String;
    SizeofFiles : Integer;
    ProgressBar : TProgressBar;
  protected
    procedure Execute; override;
  end;

implementation


procedure SplitFile(FileName : String; SizeofFiles : Integer; ProgressBar : TProgressBar);
var
i : Word;
fs, sStream: TFileStream;
SplitFileName: String;
begin

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;

constructor Some_Thread.CreateThead(AFileName: string;
  ASizeofFiles: Integer; AProgressBar: TProgressBar);
begin
  inherited Create(true);
  Self.FileName:=AFileName;
  self.SizeofFiles:=ASizeofFiles;
  Self.ProgressBar:=AProgressBar;
  Self.Resume;
end;

procedure Some_Thread.Execute;
begin
  FreeOnTerminate:=true;
  SplitFile( FileName,SizeofFiles,ProgressBar);
end;

end.



Код:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, Unit2;

type
  TForm1 = class(TForm)
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;
  Thr: Some_Thread;

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
begin
  Thr:=Some_Thread.CreateThead(...............);
end;

end.
Помог? Ну так нажми на весы!

Последний раз редактировалось SNUPY; 11.12.2009 в 01:08.
SNUPY вне форума Ответить с цитированием
Старый 11.12.2009, 01:08   #15
prizrak1390
-=PriZraK=-
Форумчанин
 
Аватар для prizrak1390
 
Регистрация: 12.12.2007
Сообщений: 399
По умолчанию

SNUPY, спасибо...вот только ошибку доступа тут выдаёт:
Self.FileName:=AFileName;
prizrak1390 вне форума Ответить с цитированием
Старый 11.12.2009, 01:09   #16
SNUPY
Форумчанин
 
Регистрация: 15.02.2008
Сообщений: 621
По умолчанию

Надо будет исправить на вот это:
Код:
procedure TForm1.Button1Click(Sender: TObject);
begin
  Thr:=Some_Thread.CreateThead(...............);
end;
01:15

Вот кстате версия где ПрогрессБар работает:
Код:
unit Unit2;

interface

uses
  ComCtrls,Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;

type
  Some_Thread = class(TThread)
  private
    FileName : String;
    SizeofFiles : Integer;
    ProgressBar : TProgressBar;
    ProgressBarPosion:Integer;
  protected
    procedure Execute; override;
    procedure UpdateProgressBar{(position:integer)};
    procedure SplitFile(FileName : String; SizeofFiles : Integer; ProgressBar : TProgressBar);
  public
    constructor CreateThead(AFileName : String; ASizeofFiles : Integer;
      AProgressBar : TProgressBar);
  end;

implementation

uses Unit1;

procedure Some_Thread.SplitFile(FileName : String; SizeofFiles : Integer; ProgressBar : TProgressBar);
var
i : Word;
fs, sStream: TFileStream;
SplitFileName: String;
begin

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);
      ProgressBarPosion:=Round((fs.Position / fs.Size) * 100);
      Synchronize(UpdateProgressBar);
     finally
       sStream.Free;
     end;
   end;
finally
   fs.Free;
end;

end;

constructor Some_Thread.CreateThead(AFileName: string;
  ASizeofFiles: Integer; AProgressBar: TProgressBar);
begin
   inherited Create(True); 
  Self.FileName:=AFileName;
  self.SizeofFiles:=ASizeofFiles;
  Self.ProgressBar:=AProgressBar;
  Resume;
end;

procedure Some_Thread.Execute;
begin
  FreeOnTerminate:=true;
  SplitFile( FileName,SizeofFiles,ProgressBar);
end;

procedure Some_Thread.UpdateProgressBar;
begin
  ProgressBar.Position := ProgressBarPosion;
end;

end.


У нас принято пользоваться кнопочкой "Правка".
Помог? Ну так нажми на весы!

Последний раз редактировалось mihali4; 11.12.2009 в 01:53.
SNUPY вне форума Ответить с цитированием
Старый 11.12.2009, 01:41   #17
prizrak1390
-=PriZraK=-
Форумчанин
 
Аватар для prizrak1390
 
Регистрация: 12.12.2007
Сообщений: 399
По умолчанию

SNUPY,спасибо, реально выручил. Обязательно укажу тебя в разделе:About)))))))
prizrak1390 вне форума Ответить с цитированием
Старый 11.12.2009, 15:14   #18
SNUPY
Форумчанин
 
Регистрация: 15.02.2008
Сообщений: 621
По умолчанию

Да всегда пожалуйста =)))) Где-то я помог, где-то мне помогли... вот и так выживаем =)))
Помог? Ну так нажми на весы!
SNUPY вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 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