Гость
Форумы / Delphi [игнор отключен] [закрыт для гостей] / PPL, параллельное выполнение кода / 14 сообщений из 14, страница 1 из 1
02.08.2021, 10:05
    #40087759
bzums
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
PPL, параллельное выполнение кода
Есть кусок кода, который работает нормально для случая с одним заданием (типа логгера):
Создается таблица РЕЗУЛЬТАТ, куда будет писаться результат (при запуске формы), при закрытии она уничтожается.
По таймеру процедура делает селект и какое-то количество записей кидает в РЕЗУЛЬТАТ, причем еще и проверяет эту таблицу РЕЗУЛЬТАТ (то есть выполняет и апдейт и инсерт и делит). Инициализация таблицы РЕЗУЛЬТАТ должна быть произведена до циклов записи.

Скопировал второй такой же набор. Минусы - если первый запрос делается минуту, второй ждет.
Решил сделать параллельно.
Сразу нарисовалась проблема таблица РЕЗУЛЬТАТ должна быть снаружи потока (она потом будет обрабатываться). Из потока и в таблицу? Некрасиво.
Ок. Вариант второй - РЕЗУЛЬТАТ в потоке (и первый раз - инициаоизация данными). Тогда и поток должен жить пока программа открыта. Так стОит делать?

Больгое спасибо.
...
Рейтинг: 0 / 0
02.08.2021, 10:12
    #40087761
Cobalt747
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
PPL, параллельное выполнение кода
bzums,

Ничего не понятно, но очень интересно.
Афтар, пеши исчо!
...
Рейтинг: 0 / 0
02.08.2021, 10:35
    #40087774
bzums
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
PPL, параллельное выполнение кода
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
constructor TZadanie.Create;
  q.SQL.Text := 'create table res ....';
  q.Open;
end;

destructor TZadanie.Destroy;
begin
  inherited;
  q.SQL.Text := drop table res ....';
  q.Open;
end;

procedure TZadanie.Run;
  procedure MakeAdd;
  begin
    q.SQL.Text := 'insert into res ...' +
    q.Open;
  end;

  procedure MakeUpdate;
  begin
    q.SQL.Text := 'update res ...' +
    q.Open;
  end;

  procedure MakeDelete;
  begin
    q.SQL.Text := 'delete from res ...' +
    q.Open;
  end;

begin
    q.SQL.Text := 'select from table ...' +
    q.Open;

      if ... then
      begin
        MakeAdd;
      end
      else
      begin
        MakeUpdate;
      end;
      else
      begin
        MakeDelete;
      end;
    end;
end;


Код для одного задания. Работает нормально. Хочу добваить второе задание.
Что если таблица res будет вне потока и поток будет к ней обращаться часто?
...
Рейтинг: 0 / 0
02.08.2021, 13:33
    #40087844
Мимопроходящий
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
PPL, параллельное выполнение кода
имхо, тут программист нужен. ©
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
02.08.2021, 13:48
    #40087850
YuRock
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
PPL, параллельное выполнение кода
bzums
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
constructor TZadanie.Create;
  q.SQL.Text := 'create table res ....';
  q.Open;
end;

destructor TZadanie.Destroy;
begin
  inherited;
  q.SQL.Text := drop table res ....';
  q.Open;
end;

Годнота!
А в чём проблема-то вкратце?
...
Рейтинг: 0 / 0
02.08.2021, 16:04
    #40087888
bzums
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
PPL, параллельное выполнение кода
ПРимер написан на коленке, не отражает истинное положение кода, просто краткое переложение архитектуры.
Однако
Вкратце: код вполне рабочий, но все работает в одном потоке.
Проблема в том, что мне нужно сделать такое (распараллелить) для произвольного количества.
Отсюда проблемма - результирующая табоица за пределами потока, ася логика - в потоке. И из потока часто надо лазить в таблицу результат.
Второй вариант - все запихать в поток - приведет к тому, что пток будет жить (получается много потоков) пока программа (по своей сути она наблюдает изменение другой таблицы) открыта. Нормальное ли такой решение?
Спасибо.
...
Рейтинг: 0 / 0
02.08.2021, 16:20
    #40087892
defecator
Модератор форума
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
PPL, параллельное выполнение кода
bzums
ПРимер написан на коленке, не отражает истинное положение кода, просто краткое переложение архитектуры.
Однако
Вкратце: код вполне рабочий, но все работает в одном потоке.
Проблема в том, что мне нужно сделать такое (распараллелить) для произвольного количества.
Отсюда проблемма - результирующая табоица за пределами потока, ася логика - в потоке. И из потока часто надо лазить в таблицу результат.
Второй вариант - все запихать в поток - приведет к тому, что пток будет жить (получается много потоков) пока программа (по своей сути она наблюдает изменение другой таблицы) открыта. Нормальное ли такой решение?
Спасибо.

тут описание задачи уже какое-то радужное
не очень понятно, что нужно сделать
...
Рейтинг: 0 / 0
02.08.2021, 17:19
    #40087913
bzums
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
PPL, параллельное выполнение кода
Совсем утрированный пример, описывающий функцию ( работает по таймеру раз в 10 минут ).
Функция сравнивает два селекта по одной и той же таблице по тем же параметрам. На предмет изменений.
1. Инициализация. Сделали селект и записали в таблицу "Результ".
2. Через 10 минут второй селект.
3. В цикле построчно, постолбцово проверяем на предмет различия, а также на предмет удаления и добавления строк.
4. Обновляем таблицу результат, чтобы она отражала текущее значение.
5. Через 10 минут сначала.

Если все 5 шагов засунуть в поток, то не произвести инициализацию. Или поток должен висеть постоянно.

Если в поток пихать все кроме первого шага - то какая-то фигня.

Есть выход?
Большое спасибо.
...
Рейтинг: 0 / 0
02.08.2021, 17:24
    #40087915
энди
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
PPL, параллельное выполнение кода
не проще модифицировать таблицу так чтобы всегда можно было достать дельту с последнего забора данных?
...
Рейтинг: 0 / 0
02.08.2021, 17:28
    #40087918
bzums
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
PPL, параллельное выполнение кода
Таблицы как таковой нет.
Это собственный формат, близкий к тексту.
С некоторыми изменениями.
Есть некий драйвер который даёт датасет.
Этот вариант вполне рабочий для одного набора. Второй ждёт в очереди, получается.
Надо распараллелить.
...
Рейтинг: 0 / 0
02.08.2021, 18:06
    #40087941
Zelius
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
PPL, параллельное выполнение кода
bzums,

обычно, что бы второй поток не ждал, если у него свои данные, то он создает второе независимое подключение и все, вопрос решен...
...
Рейтинг: 0 / 0
02.08.2021, 20:20
    #40088000
bzums
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
PPL, параллельное выполнение кода
Мне с первым потоком непонятно что делать :-)
Логика построена таким образом, что вне потока огромный набор ( и он должен быть ) и в потоке он же самый практически. И их надо сравнить.
...
Рейтинг: 0 / 0
02.08.2021, 20:36
    #40088002
bzums
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
PPL, параллельное выполнение кода
Если TkbmMemTable 100 процентов потокобезопасна, то могу ли я использовать ее из потока, если она сама находится вне потока?
...
Рейтинг: 0 / 0
03.08.2021, 17:45
    #40088314
Garamzin
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
PPL, параллельное выполнение кода
bzums
Если TkbmMemTable 100 процентов потокобезопасна, то могу ли я использовать ее из потока, если она сама находится вне потока?

можно, но не напрямую а с эвентами, оконными сообщениями, мютексами, используя Lock.
Самое дубовое и простое использовать TCriticalSection, но при множестве потоков это становится узким горлышком и вся многопоточность летит в трубу.
Самое быстрое это использовать эвенты и оконные сообщения PostMessage.
Но для твоей задачи хватит и TCriticalSection.
Расписывать что и как это долго и муторно раз с потоками не работал, почитай лучше учебники.
В последних делфях есть модуль THReading, упрощает работу с потоками.
Но без знания базы можно выстрелить себе в ногу.
...
Рейтинг: 0 / 0
Форумы / Delphi [игнор отключен] [закрыт для гостей] / PPL, параллельное выполнение кода / 14 сообщений из 14, страница 1 из 1
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]