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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> закачка данных отдельным потоком 
:(
    Опции темы
rOOxus
Дата 28.4.2009, 15:14 (ссылка) |   (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Awaiting Authorisation
Сообщений: 95
Регистрация: 28.8.2006

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



здравствуйте коллеги!
пишу программку для закачки данных из DBF файла в БД FireBird. Идея следующая: доступ к DBF средствами BDE через TTable, в БД есть процедура параметры которой имеют те же имена, что и поля DBF-таблицы и которая осуществляет преобразования этих полей а так же распихивает их данные по разным таблицам. По Table1 организован цикл, который присваивает значения параметров значениям полей и выполняет процедуру. Получаеться примерно так:
Код

procedure TForm1.Button1Click(Sender: TObject);
var
   i : Integer;
begin
   while not Table1.Eof do
   begin
      // цикл ищет и присваивает параметры хранимой процедуре
      // по идетничным названиям полей Table1
      for i := 0 to Table1.Fields.Count - 1 do
      begin
         IBSP.Params.ParamByName( Table1.Fields.Fields[i].FieldName ).Value :=
            Table1.Fields.Fields[i].Value;
      end;
      // выполняем процедуру
      IBSP.ExecProc;
      // следующая запись
      Table1.Next;
   end;
end;

вопрос в следующем как сделать процесс такой "закачки" отдельным потоком т.к. в DBF-файле 2 млн записей? ну чтоб пользователя можно было поразвлекать выводом процесса закачки

PM MAIL   Вверх
uranpro
Дата 28.4.2009, 15:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 571
Регистрация: 7.5.2008
Где: Moscow city

Репутация: нет
Всего: 1



Код

  BeginThread(nil,0,@ProcedureName ,nil,0,PLongWord(nil)^);



--------------------
I want a perfect soul
PM MAIL ICQ   Вверх
uranpro
Дата 28.4.2009, 15:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 571
Регистрация: 7.5.2008
Где: Moscow city

Репутация: нет
Всего: 1



гы) можно так еще:
Код

procedure TForm1.Button1Click(Sender: TObject);
var
   i : Integer;
begin
   while not Table1.Eof do
   begin

      PB.Position++; // !
      Application.ProcessMessages; // !

      // цикл ищет и присваивает параметры хранимой процедуре
      // по идетничным названиям полей Table1
      for i := 0 to Table1.Fields.Count - 1 do
      begin
         IBSP.Params.ParamByName( Table1.Fields.Fields[i].FieldName ).Value :=
            Table1.Fields.Fields[i].Value;
      end;
      // выполняем процедуру
      IBSP.ExecProc;
      // следующая запись
      Table1.Next;
   end;
end;



--------------------
I want a perfect soul
PM MAIL ICQ   Вверх
rOOxus
Дата 29.4.2009, 08:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Awaiting Authorisation
Сообщений: 95
Регистрация: 28.8.2006

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



Вариант с  BeginThread вызывает ошибку Error reading data from the connection если запустить еще одну, естественно не связанную с компонентом IBSP, транзакцию этой же программы, а если запустить еще одну копию программы, то все нормально. С Application.ProcessMessages такой ошибки вроде не возникает. Время выполнения обоих вариантов при прочих равных условиях одно и то же.
хотелось бы услышать мнение как корректнее это выполнять через BeginThread или путем проталкивания очереди сообщений Application.ProcessMessages?
PM MAIL   Вверх
Frees
Дата 29.4.2009, 08:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

Репутация: 9
Всего: 54



Цитата(rOOxus @  29.4.2009,  10:37 Найти цитируемый пост)
хотелось бы услышать мнение как корректнее это выполнять через BeginThread или путем проталкивания очереди сообщений Application.ProcessMessages?

мне кажется это зависит от религиозных убеждении

только в случае с ProcessMessages нужно дополнительно обработать возможность закрытия программы

можно еще что то типа TProgressDialog использовать http://www.torry.net/pages.php?id=84




--------------------
Кольцов Виктор Владимирович
PM MAIL ICQ   Вверх
uranpro
Дата 29.4.2009, 10:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 571
Регистрация: 7.5.2008
Где: Moscow city

Репутация: нет
Всего: 1



попробуй создать поток так:
Код

  TMyThread = class(TThread)
  private
    i:integer;
    procedure WriteToLabel;
  protected
    procedure Execute; override;
  end;

var
  Form1: TForm1;
  MyThread:TMyThread;

implementation

{$R *.dfm}

procedure TMyThread.WriteToLabel;
begin
  Form1.Label1.Caption:=inttostr(i);
end;

procedure TMyThread.Execute;
var
  k,j:integer;
begin
  j:=1;
  for k:=1 to 1000000 do begin
    inc(j);
    if j=100 then begin
      i:=k;
      Synchronize(WriteToLabel);
      j:=1;
      end;
    end;
  Terminate;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
  MyThread:=TMyThread.Create(true);
  MyThread.FreeOnTerminate:=true;
  MyThread.Resume;
end;


Добавлено через 1 минуту и 36 секунд
только добавь в поток соединения и тд...


--------------------
I want a perfect soul
PM MAIL ICQ   Вверх
uranpro
Дата 29.4.2009, 10:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 571
Регистрация: 7.5.2008
Где: Moscow city

Репутация: нет
Всего: 1





--------------------
I want a perfect soul
PM MAIL ICQ   Вверх
rOOxus
Дата 29.4.2009, 16:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Awaiting Authorisation
Сообщений: 95
Регистрация: 28.8.2006

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



спасибо огомное за помощь. у меня еще вопросик слегка не в тему:
вот код
Код

   try
      IBSP.ExecProc;
   except
      BatchResultCode := -1;
      Break;
   end;

а как мне получить текст сообщения сервера об ошибке выполнения хранимой процедуры тот самый который выкатился бы без try ... except?
PM MAIL   Вверх
uranpro
Дата 29.4.2009, 16:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 571
Регистрация: 7.5.2008
Где: Moscow city

Репутация: нет
Всего: 1



Код

try
  code
except
  on E:Exception do showmessage(E.Message);
  end;
...
try
  code
except
  on E:Exception do begin
    showmessage(E.Message);
    code;
    end;
  end;



--------------------
I want a perfect soul
PM MAIL ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Общие вопросы"
SnowyMetalFan
bemsPoseidon
Rrader

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

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

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

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


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

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


 




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


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

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