Модераторы: Poseidon, Snowy, bems, MetalFan
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Свой класс по обработке файлов, Нужна помощь 
V
    Опции темы
Rodman
Дата 11.12.2006, 20:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


CIO
****


Профиль
Группа: Участник
Сообщений: 6144
Регистрация: 7.5.2006
Где: Ukraine ⇛ Kyiv ci ty

Репутация: 7
Всего: 122



Дароф.

Суть задания заключается в параллельной обработке файлов.
Допустим, есть несколько больших файлов и определен алгоритм их обработки (например, инвертирование битов). Обработка каждого файла занимает порядка 10 секунд.
Для обработки файлов написать класс с методом старта обработки
1. ProcessFile(FileName)
И двумя событиями
2. OnProgress(Percentage)
3. OnFinish()
После этого реализовать параллельную обработку файлов с общим прогрессом.

На форме должен быть такой интерфейс:
1. Список файлов
2. Кнопка запуска обработки
3. Индикатор прогресса (общего прогресса).
После завершения обработки должно появится сообщение с соответствующим текстом.

Вот  что я сделал
Код

unit Unit1;

interface

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

type
  TMyClass = class
    procedure ProcessFile(FileName:WideString);
  private
    FOnProgress: TNotifyEvent;
    FOnFinish: TNotifyEvent;
    Percentage:Integer;
    procedure SetOnFinish(const Value: TNotifyEvent);
    procedure SetOnProgress(const Value: TNotifyEvent);
  public
    property OnProgress:TNotifyEvent read FOnProgress write SetOnProgress;
    property OnFinish:TNotifyEvent read FOnFinish write SetOnFinish;
  end;
  TForm1 = class(TForm)
    Button1: TButton;
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

{ TMyClass }

procedure TMyClass.ProcessFile(FileName:WideString);
var LoadFile:TStringList;
    i,j:Integer;
    test,test2:WideString;
begin
  LoadFile:=TStringList.Create;
  LoadFile.LoadFromFile(FileName);
  Percentage:=0;
  for i:=0 to LoadFile.Count-1 do
  begin
    test:=LoadFile.Strings[i];
    test2:='';
    for j:=1 to Length(LoadFile.Strings[i])do
      test2:=test2+IntToStr(ord(test[j]));
    LoadFile.Strings[i]:=test2;
  end;
  ShowMessage(LoadFile.Text);
end;

procedure TMyClass.SetOnFinish(const Value: TNotifyEvent);
begin
  FOnFinish := Value;
end;

procedure TMyClass.SetOnProgress(const Value: TNotifyEvent);
begin
  FOnProgress := Value;
end;

end.


я не очень пойму как мне обработать события (и в одном событии еще параметр есть, тоже не совсем понял как его описать)...

Спасибо
PM MAIL WWW Skype GTalk YIM MSN   Вверх
Matematik
Дата 11.12.2006, 20:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1027
Регистрация: 11.3.2006

Репутация: 17
Всего: 50



В конце ProcessFile
Код

if Assigned(FOnFinish) then
  FOnFinish(Self)


PM MAIL WWW ICQ   Вверх
Alexeis
Дата 11.12.2006, 20:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

Репутация: 109
Всего: 459



Цитата(Rodman @  11.12.2006,  20:15 Найти цитируемый пост)
я не очень пойму как мне обработать события (и в одном событии еще параметр есть, тоже не совсем понял как его описать)...

Спасибо


Да сдались эти события! Они же тут ничего не дадут. Если бы экземпляров было много то еще куда бы ни шло или там класс был компонентом, а отрисовка прогресса ложилась на другого разработчика, то да, а так смысла нет, события должны вызываться вручную из методов класса, в этом случае удобнее использовать обычные методы класса, чем делать двойную работу. Сам читаешь файл блоками и после чтения нескольких блоков вызываешь процедуру отрисовки прогресса. 

По поводу размера буфера опытным путем установлено, что лучший буфер для чтения это 20-60кб
если интересно то я вот тут тестировал Файловый поток в работе


--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
Rodman
Дата 12.12.2006, 12:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


CIO
****


Профиль
Группа: Участник
Сообщений: 6144
Регистрация: 7.5.2006
Где: Ukraine ⇛ Kyiv ci ty

Репутация: 7
Всего: 122



Вот я не много поменял
Код

unit Unit1;

interface

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

type
  TMyClass = class
    procedure ProcessFile(FileName:WideString);
  private
    FOnProgress: TNotifyEvent;
    FOnFinish: TNotifyEvent;
    Percentage:Integer;
    procedure SetOnFinish(const Value: TNotifyEvent);
    procedure SetOnProgress(const Value: TNotifyEvent);
  public
    property OnProgress:TNotifyEvent read FOnProgress write SetOnProgress;
    property OnFinish:TNotifyEvent read FOnFinish write SetOnFinish;
  end;
  TForm1 = class(TForm)
    Button1: TButton;
    OpenDialog1: TOpenDialog;
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

{ TMyClass }

procedure TMyClass.ProcessFile(FileName:WideString);
var LoadFile:TStringList;
    i,j:Integer;
    test,test2:WideString;
begin
  LoadFile:=TStringList.Create;
  LoadFile.LoadFromFile(FileName);
  Percentage:=1;/// тут ошибку досуа вылетает
  for i:=0 to LoadFile.Count-1 do
  begin
    test:=LoadFile.Strings[i];
    test2:='';
    for j:=1 to Length(LoadFile.Strings[i])do
      test2:=test2+IntToStr(ord(test[j]));
    LoadFile.Strings[i]:=test2;
  end;
  if Assigned(FOnFinish) then
    FOnFinish(Self);
  ShowMessage(LoadFile.Text);
end;

procedure TMyClass.SetOnFinish(const Value: TNotifyEvent);
begin
  FOnFinish := Value;
end;

procedure TMyClass.SetOnProgress(const Value: TNotifyEvent);
begin
  FOnProgress := Value;
end;

procedure TForm1.Button1Click(Sender: TObject);
var c:TMyClass;
begin
//  c:=c.Create;
  if(OpenDialog1.Execute)then
    c.ProcessFile(OpenDialog1.FileName);
end;

end.


как мне исправить ошибку??? 
PM MAIL WWW Skype GTalk YIM MSN   Вверх
Matematik
Дата 12.12.2006, 12:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1027
Регистрация: 11.3.2006

Репутация: 17
Всего: 50



Объект создавать надо
Код

var c:TMyClass;
begin
  c:=TMyClass.Create;

PM MAIL WWW ICQ   Вверх
Rodman
Дата 12.12.2006, 12:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


CIO
****


Профиль
Группа: Участник
Сообщений: 6144
Регистрация: 7.5.2006
Где: Ukraine ⇛ Kyiv ci ty

Репутация: 7
Всего: 122



Matematik, я это сделал - вылетело ...


Project Project1.exe raised exception class EAccessViolation with message 'Access violation at address 0040347F in module 'Project1.exe'. Read of address 8BD88B37'. Process stopped. Use Step or Run to continue.


PM MAIL WWW Skype GTalk YIM MSN   Вверх
Matematik
Дата 12.12.2006, 12:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1027
Регистрация: 11.3.2006

Репутация: 17
Всего: 50



Цитата(Rodman @ 12.12.2006,  12:47)
Matematik, я это сделал - вылетело ...


Project Project1.exe raised exception class EAccessViolation with message 'Access violation at address 0040347F in module 'Project1.exe'. Read of address 8BD88B37'. Process stopped. Use Step or Run to continue.

У меня "вылетело" ShowMessage

Код

procedure TForm1.Button1Click(Sender: TObject);
var c:TMyClass;
begin
  c:=TMyClass.Create;
  if(OpenDialog1.Execute)then
    c.ProcessFile(OpenDialog1.FileName);
end;

PM MAIL WWW ICQ   Вверх
Rodman
Дата 12.12.2006, 13:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


CIO
****


Профиль
Группа: Участник
Сообщений: 6144
Регистрация: 7.5.2006
Где: Ukraine ⇛ Kyiv ci ty

Репутация: 7
Всего: 122



 smile 

А не подскажешь из-за чего может вылетать такое???
PM MAIL WWW Skype GTalk YIM MSN   Вверх
Matematik
Дата 12.12.2006, 13:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1027
Регистрация: 11.3.2006

Репутация: 17
Всего: 50



Покажи весь код и на какой строке ошибка?
PM MAIL WWW ICQ   Вверх
Rodman
Дата 12.12.2006, 13:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


CIO
****


Профиль
Группа: Участник
Сообщений: 6144
Регистрация: 7.5.2006
Где: Ukraine ⇛ Kyiv ci ty

Репутация: 7
Всего: 122



вот
Код

  unit Unit1;

interface

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

type
  TMyClass = class
    procedure ProcessFile(FileName:WideString);
  private
    FOnProgress: TNotifyEvent;
    FOnFinish: TNotifyEvent;
    Percentage:Integer;
    procedure SetOnFinish(const Value: TNotifyEvent);
    procedure SetOnProgress(const Value: TNotifyEvent);
  public
    property OnProgress:TNotifyEvent read FOnProgress write SetOnProgress;
    property OnFinish:TNotifyEvent read FOnFinish write SetOnFinish;
  end;
  TForm1 = class(TForm)
    Button1: TButton;
    OpenDialog1: TOpenDialog;
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

{ TMyClass }

procedure TMyClass.ProcessFile(FileName:WideString);
var LoadFile:TStringList;
    i,j:Integer;
    test,test2:WideString;
begin
  LoadFile:=TStringList.Create;
  LoadFile.LoadFromFile(FileName);
  Percentage:=1; // а если создание класса коментирую, то здесь вылетает...
  for i:=0 to LoadFile.Count-1 do
  begin
    test:=LoadFile.Strings[i];
    test2:='';
    for j:=1 to Length(LoadFile.Strings[i])do
      test2:=test2+IntToStr(ord(test[j]));
    LoadFile.Strings[i]:=test2;
  end;
  if Assigned(FOnFinish) then
    FOnFinish(Self);
  ShowMessage(LoadFile.Text);
end;

procedure TMyClass.SetOnFinish(const Value: TNotifyEvent);
begin
  FOnFinish := Value;
end;

procedure TMyClass.SetOnProgress(const Value: TNotifyEvent);
begin
  FOnProgress := Value;
end;

procedure TForm1.Button1Click(Sender: TObject);
var c:TMyClass;
begin
  c:=c.Create;// вот здесь вылетает вышеуказанная ошибка
  if(OpenDialog1.Execute)then
    c.ProcessFile(OpenDialog1.FileName);
end;

end.


все в коментариях
PM MAIL WWW Skype GTalk YIM MSN   Вверх
Matematik
Дата 12.12.2006, 13:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1027
Регистрация: 11.3.2006

Репутация: 17
Всего: 50



Rodman, невнимательно читаешь
Объекты создаеются так
Код

c := TMyClass.Create;

Ошибка на 
Percentage:=1
получается из-за того что ты пытаешься записать в переменную которой не существует! (объект ведь не создан)
PM MAIL WWW ICQ   Вверх
Rodman
Дата 12.12.2006, 13:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


CIO
****


Профиль
Группа: Участник
Сообщений: 6144
Регистрация: 7.5.2006
Где: Ukraine ⇛ Kyiv ci ty

Репутация: 7
Всего: 122



Matematik, Сенкс...

Понял свою ошибку..
PM MAIL WWW Skype GTalk YIM MSN   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Общие вопросы"
SnowyMetalFan
bemsPoseidon
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0611 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.