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

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

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

Ничего не понятно, но очень интересно.
Афтар, пеши исчо!
...
Рейтинг: 0 / 0
PPL, параллельное выполнение кода
    #40087774
bzums
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Код: 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
PPL, параллельное выполнение кода
    #40087844
Мимопроходящий
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
имхо, тут программист нужен. ©
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
PPL, параллельное выполнение кода
    #40087850
YuRock
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
PPL, параллельное выполнение кода
    #40087888
bzums
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
ПРимер написан на коленке, не отражает истинное положение кода, просто краткое переложение архитектуры.
Однако
Вкратце: код вполне рабочий, но все работает в одном потоке.
Проблема в том, что мне нужно сделать такое (распараллелить) для произвольного количества.
Отсюда проблемма - результирующая табоица за пределами потока, ася логика - в потоке. И из потока часто надо лазить в таблицу результат.
Второй вариант - все запихать в поток - приведет к тому, что пток будет жить (получается много потоков) пока программа (по своей сути она наблюдает изменение другой таблицы) открыта. Нормальное ли такой решение?
Спасибо.
...
Рейтинг: 0 / 0
PPL, параллельное выполнение кода
    #40087892
Фотография defecator
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
bzums
ПРимер написан на коленке, не отражает истинное положение кода, просто краткое переложение архитектуры.
Однако
Вкратце: код вполне рабочий, но все работает в одном потоке.
Проблема в том, что мне нужно сделать такое (распараллелить) для произвольного количества.
Отсюда проблемма - результирующая табоица за пределами потока, ася логика - в потоке. И из потока часто надо лазить в таблицу результат.
Второй вариант - все запихать в поток - приведет к тому, что пток будет жить (получается много потоков) пока программа (по своей сути она наблюдает изменение другой таблицы) открыта. Нормальное ли такой решение?
Спасибо.

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

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

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

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

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

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


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