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

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

Вернуться   Форум программистов > Delphi программирование > БД в Delphi
Регистрация

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 22.12.2021, 00:36   #1
pro100kos
 
Регистрация: 22.12.2021
Сообщений: 5
Печаль Перебор данных из бд в несколько потоков

Есть запрос к бд типо такого
Код:
  dm.AdUpdatePOsitions.SQL.Clear;
  dm.AdUpdatePOsitions.SQL.Add('SELECT * FROM Position');
  dm.AdUpdatePOsitions.Active:=True;
  dm.AdUpdatePOsitions.first;
Мы получаем данные определенной таблицы (теперь эти данные нужно передать в несколько потоков и перебрать) как это можно сделать подскажите пожалуйста. в одном потоке я перебираю вот так
Код:
  while (not dm.AdUpdatePOsitions.Eof) do
  begin
    dm.AdUpdatePOsitions.Next;
  end;
Как это сделать в несколько потоков
pro100kos вне форума Ответить с цитированием
Старый 22.12.2021, 09:00   #2
evg_m
Старожил
 
Регистрация: 20.04.2008
Сообщений: 5,526
По умолчанию

1. выбирать непересекающиеся диапазоны данныx в НЕСКОЛЬКО (по числу потоков) DataSet
Код:
.... from where id in (1, ...., 1000)
.... in (1001, ...., 2000)
....
или любой другой код ограничения выбора (top limit ... )
программа — запись алгоритма на языке понятном транслятору

Последний раз редактировалось evg_m; 22.12.2021 в 09:07.
evg_m вне форума Ответить с цитированием
Старый 22.12.2021, 20:43   #3
pro100kos
 
Регистрация: 22.12.2021
Сообщений: 5
По умолчанию

может чего-то не понимаю но факт что скорость что в 1 потоке или в 10 одна и та же (низка) или может я чего то не так


Код:

......
type
  TMyThread = class(TThread)
  private
  protected
    procedure Execute; override;
    procedure memoAdd;
  public
    msg:string;
    N:integer;
  end;

.......
  private
    MyT:array of TMyThread;
  public
     o:integer;
     CounArray:integer;
  end;
.........

procedure TMyThread.Execute;
var //nw :string;
    b,A:integer;
begin
dm.AdUpdatePOsitions.ExecSQL;
b:= N  * form5.CounArray; //Присваеваем единицу
A :=  b - form5.CounArray;

  while A <> b do
  begin
    inc(A);   
    msg:= inttostr(A) + ' Поток номер '+ inttostr(N) +' запущен! '+inttostr(Form5.o)+' '+dm.AdUpdatePOsitions.FieldByName('Words').AsString;
    Synchronize(memoAdd);
    dm.AdUpdatePOsitions.Next;
  end;
end;

procedure TMyThread.memoAdd;
begin
  Form5.Memo1.Lines.Add(msg);
end;

procedure TForm5.BitBtn1Click(Sender: TObject);
var i,nn:integer;
begin
  dm.AdUpdatePOsitions.SQL.Clear;
  dm.AdUpdatePOsitions.SQL.Add('SELECT * FROM Position');
  dm.AdUpdatePOsitions.Active:=True;
  dm.AdUpdatePOsitions.first;

  nn := dm.AdUpdatePOsitions.RecordCount; //подсчет количества данных в массиве
  CounArray :=  Trunc ( nn /  SpinEdit1.value );   //округлим в меньшую сторону


//создание потоков
  for i := 1 to SpinEdit1.value do begin
    SetLength(MyT,i+1);
    MyT[i]:=TMyThread.Create(True);
    MyT[i].Priority:= tpLowest;
    MyT[i].N:=i;
    MyT[i].FreeOnTerminate:=True; 
    MyT[i].Start;
  end;
end;

Последний раз редактировалось pro100kos; 23.12.2021 в 02:25. Причина: Дополнение кода
pro100kos вне форума Ответить с цитированием
Старый 23.12.2021, 02:20   #4
pro100kos
 
Регистрация: 22.12.2021
Сообщений: 5
По умолчанию

может чего-то не понимаю но факт что скорость что в 1 потоке или в 10 одна и та же (низка) или может я чего то не так
pro100kos вне форума Ответить с цитированием
Старый 23.12.2021, 09:04   #5
evg_m
Старожил
 
Регистрация: 20.04.2008
Сообщений: 5,526
По умолчанию

учитывая что основная нагрузка потоков находится здесь
Цитата:
Код:
Synchronize(memoAdd);
то можно с уверенностью сказать что БЕЗ потоков будет быстрее.
читаем форум через поиск по слову Synchonize
программа — запись алгоритма на языке понятном транслятору
evg_m вне форума Ответить с цитированием
Старый 06.01.2022, 15:10   #6
pro100kos
 
Регистрация: 22.12.2021
Сообщений: 5
По умолчанию

evg_m, эта процедура указана в качестве примера, в потоке выполняется какое-то действие (например поход на какой то url адрес) а потом возвращаются данные.
pro100kos вне форума Ответить с цитированием
Старый 11.01.2022, 09:16   #7
evg_m
Старожил
 
Регистрация: 20.04.2008
Сообщений: 5,526
По умолчанию

https://programmersforum.ru/showthread.php?t=266457
программа — запись алгоритма на языке понятном транслятору
evg_m вне форума Ответить с цитированием
Старый 19.01.2022, 15:09   #8
pro100kos
 
Регистрация: 22.12.2021
Сообщений: 5
По умолчанию

В общем в потоке все перебирает отлично, но вот делаю запись в бд Access через синхронизацию
использую вот эту функцию RecordPositions. Создается большая очередь и программа работает не очень быстро из-за этого как можно произвести запись прямо в потоке? (например без синхронизации)
Код:
function RecordPositions(a,b,c:integer; d,e,r,t:string):string;
begin
      dm.AdQ_Pos1.Active:=true;
      dm.AdQ_Pos1.Append;
      dm.AdQ_Pos1.FieldByName('t').AsString := t;
      dm.AdQ_Pos1.FieldByName('b').AsInteger := b; 
      dm.AdQ_Pos1.FieldByName('c').AsInteger := c; 
      dm.AdQ_Pos1.FieldByName('d').AsString := d;
      dm.AdQ_Pos1.FieldByName('e').AsString := e; 
      dm.AdQ_Pos1.FieldByName('r').AsString := r; 
      dm.AdQ_Pos1.FieldByName('a').AsInteger := a; 
      dm.AdQ_Pos1.POST;
      dm.AdQ_Pos1.Active:=false;
      Exit;
end;
pro100kos вне форума Ответить с цитированием
Старый 20.01.2022, 09:12   #9
evg_m
Старожил
 
Регистрация: 20.04.2008
Сообщений: 5,526
По умолчанию

1. иметь в каждом потоке свой объект доступа к БД.
но в таком случае очередь будет в самом Access (и такая же длинная ).
а потоки вероятно все также будут ждать (только теперь окончания записи).

2. не закрывать НД после каждой записи.
Цитата:
Код:
  dm.AdQ_Pos1.Active:=false;
3. выполнять запись используя Insert (инструкцию SQL). в любом из вариантов 1, 2.
программа — запись алгоритма на языке понятном транслятору
evg_m вне форума Ответить с цитированием
Ответ


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

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Поток запускает несколько потоков bilibian Общие вопросы Delphi 3 21.08.2016 11:30
Сбор инфы в несколько потоков bilibian Общие вопросы Delphi 7 18.02.2014 16:35
Логгирование, несколько потоков pa6kevi4 Общие вопросы .NET 3 12.06.2010 22:32
Загрузка файла в несколько потоков Joe_Tribbiani Работа с сетью в Delphi 12 11.04.2009 12:06
Несколько потоков Adm Общие вопросы Delphi 13 18.01.2008 20:04