Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Lazarus: выборка в потоке / 25 сообщений из 42, страница 1 из 2
29.03.2018, 10:40
    #39622491
Док
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Lazarus: выборка в потоке
как продолжение этой темы

Не хочется изобреть свой велосипед. Хотел уточнить у тех, кто пользует этот вариант, как вы передаете параметры запроса в поток:

1. отдельно текст запроса + массив имен параметров + массив значений параметров
2. текст запроса --> парсинг имен параметров в теле доп.потока + массив значений параметров
3. еще как-то...

?
=================
Док.

Win7 Ultim x64/Deb 9.2(GNOME, MATE; gtk2) i386:
FB 3.0.2.32703, диалект 3, SS,
Lazarus 1.9(r.57543); FPC 3.1.1 (r.38588), IBX by -Rik-; IBE 2017.4.19.2
...
Рейтинг: 0 / 0
29.03.2018, 11:14
    #39622522
DarkMaster
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Lazarus: выборка в потоке
Док,

1 вариант - наиболее прозрачный как по мне.
...
Рейтинг: 0 / 0
29.03.2018, 22:06
    #39622935
stanilar
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Lazarus: выборка в потоке
Вот такое читал?
...
Рейтинг: 0 / 0
30.03.2018, 11:38
    #39623139
YuRock
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Lazarus: выборка в потоке
stanilarВот такое читал?
Пролистал статью, раньше ее не видел. Странная.
1. Вначале предлагается использование FreeOnTerminate, OnTerminate и Synchronize как панацею от всех бед, при этом не описываются связанные с этим грабли. Хотя статья времен D5, когда Synchronize работал через SendMessage, и граблей было поэтому меньше, но часть их была всё равно.
2. Потом, наконец, честно описываются обычные проблемы, которые возникают из-за использования вышепредложенного мусора, типа дэдлоков при WaitFor и Synchronize/OnTerminate, и героические пути их решения. При чем таким тоном, как будто эти муки - обычная необходимая вещь, рутина в жизни любого опытного программера.
3. И в конце - создание более-менее похожего на жизнеспособный примера без использования всего этого говна, и радостное заключение: "Мы достигли нашей цели!.. Не используется Synchronize. Потоки без необходимости не блокируются"!
Да, неожиданный конец. Вернее, в реальной жизни всегда так - как ни пытайся сделать яичницу из теннисных шариков, всё равно придется сходить в магазин за яйцами.
Но странно, когда статья изначально в споре зеленого и черного топит за зеленое, а заканчивается утверждением, что черное лучше.

Вообще, впечатление, что автор статьи - мазохист.
...
Рейтинг: 0 / 0
30.03.2018, 11:44
    #39623149
YuRock
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Lazarus: выборка в потоке
По теме.
1-й вариант - нормальный. 3 параметра в конструктор потока, например.
...
Рейтинг: 0 / 0
30.03.2018, 14:45
    #39623323
white_nigger
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Lazarus: выборка в потоке
YuRockПролистал статью, раньше ее не видел. Странная.Вообще-то это хрестоматийная книга по потокам в делфи, необходимая каждому, кто хочет научится ими пользоваться. А то потом плодятся с альтернативными подходами...
...
Рейтинг: 0 / 0
30.03.2018, 14:54
    #39623336
YuRock
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Lazarus: выборка в потоке
white_niggerВообще-то это хрестоматийная книга по потокам в делфи, необходимая каждому, кто хочет научится ими пользоваться
Я в тебе и не сомневался
...
Рейтинг: 0 / 0
30.03.2018, 16:21
    #39623430
Док
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Lazarus: выборка в потоке
white_niggerВообще-то это хрестоматийная книга по потокам в делфи
все это читано и не раз. В статье даны основы, но вопрос в другом

YuRock3 параметра в конструктор потока, например
Скажем, если я буду пользовать конструкцию примерно такого вида
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
type
  TPrmNameArr = array of String;
  TPrmValueArr = array of Variant;

  TMyRec = packed record
    SQLText: String;
    ParamName: TPrmNameArr;
    ParamValue: TPrmValueArr;
  end;  

procedure ...
var MyRec: TMyRec;
...
//<задаем размер и заполняем MyRec>
...
MyThread:= TMyThread.Create (..,MyRec, ...);
...


есть ли какие подводные камни, типа необходимости использования ZeroMemory и проч.?
...
Рейтинг: 0 / 0
30.03.2018, 17:04
    #39623480
YuRock
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Lazarus: выборка в потоке
Док,

Не знаю, я лично не люблю в структурах автоматические типы.
...
Рейтинг: 0 / 0
30.03.2018, 17:11
    #39623491
DarkMaster
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Lazarus: выборка в потоке
Док,

А почему нe:

Код: pascal
1.
constructor TMyThread.Create(SQL:String; ParamNames:array of string; ParamValues:array of Variant);
...
Рейтинг: 0 / 0
30.03.2018, 17:26
    #39623503
Док
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Lazarus: выборка в потоке
DarkMasterА почему нe:
"Не аккуратненько" ©

На самом деле, я на стендовых проектиках сейчас в поток передаю что-то типа Array of TMyRec, только у структуры поля простые (стринги, целые, пойнтеры и проч.), потому что будет необходимость передавать и блобы. Конечно, хочется сделать какой-нибудь универсальный наследник потока. Но боюсь утонуть в его коде. Похоже, придется отделять мух от котлет :)

Дело для меня новое, опыта нет. Вот и экспериментирую.
...
Рейтинг: 0 / 0
30.03.2018, 17:41
    #39623513
DarkMaster
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Lazarus: выборка в потоке
Док,

Угу, а отдавать в поток array of Rec, который тоже где-то как-то заполняется - более красиво У меня хоть ясно видно, какой поток с какими параметрами зовется. А блобы и в MemoryStream можно запихнуть - я не думаю, что их у тебя (параметров в виде блоба), много будет - не самый распространненый вид данных.
...
Рейтинг: 0 / 0
30.03.2018, 17:46
    #39623517
stanilar
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Lazarus: выборка в потоке
white_niggerхрестоматийная книга
Вот потому и дана ссылка.

Что касается вопроса, то у меня возникло ощущение что архитектура будущего решения притягивается к способу реализации. Зачем передавать какие-то параметры в поток, (что говорит о том, что бизнес-логика вне потока), когда можно синхронизировать датасурс с датасетом после завершения запроса (говоря по другому - передать всю бизнесс-логику в поток)?
...
Рейтинг: 0 / 0
30.03.2018, 18:02
    #39623522
stanilar
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Lazarus: выборка в потоке
YuRockВообще, впечатление, что автор статьи - мазохист.

Дай ссылку на лучшее. Не все хотят тратить свое время на изучения граблей, хотя такие знания и приветствуются. Но тем, кто во всем разобрался и поделился своими познаниями с остальными - честь и хвала.


YuRockпредлагается использование FreeOnTerminate, OnTerminate и Synchronize

Как по мне, так в статье предлагается понять, как абракадабра видит работу паскалистов с потоками. Сие учебное пособие достаточно корректно описывает особенности работы стандартных библиотек.

P/S/

Можно еще посоветовать Доку аналог omni thread под лазарь, чтоб под влиянием кода от гуру программирования его дзен поразил бы нас своей красотой! Но вот увы - под лазарь мне такие библиотеки неизвестны.
...
Рейтинг: 0 / 0
30.03.2018, 18:05
    #39623524
YuRock
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Lazarus: выборка в потоке
ДокКонечно, хочется сделать какой-нибудь универсальный наследник потока.
Универсальность обычно ухудшает функциональность.
Совсем универсально можно сделать так:
Код: 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.
50.
51.
52.
53.
54.
55.
type
  TMyParams = class
    SQL: String;
    ParamNames: Array of String;
    ParamValues: Array of Variant;
    // ... Ну и еще что хочешь - блобы, пойнтеры... главное потом не забыть копирование сделать в Assign

    constructor Create( ACopyFrom: TMyParams = nil );
    procedure Assign( ACopyFrom: TMyParams );
  end;

constructor TMyParams.Create( ACopyFrom: TMyParams = nil );
begin
  if Assigned( ACopyFrom ) then
    Assign( ACopyFrom );
end;

procedure TMyParams.Assign( ACopyFrom: TMyParams );
var
  i, nLen: Integer;
begin
  SQL := ACopyFrom.SQL;
  
  nLen := Length( ACopyFrom.ParamNames );
  
  SetLength( ParamNames, nLen );
  for i := 0 to nLen - 1 do
    ParamNames[ i ] := ACopyFrom.ParamNames[ i ];

  SetLength( ParamValues, nLen );
  for i := 0 to nLen - 1 do
    ParamValues[ i ] := ACopyFrom.ParamValues[ i ];
end;

// ну и поток
type
  TMyThread = class( TThread )
  private
    FParams: TMyParams;
  public
    constructor Create( const Params: TMyParams );
    destructor Destroy; override;
  end;

constructor TMyThread.Create( const Params: TMyParams );
begin
  FParams := TMyParams.Create( AParams );
  ...
end;

destructor TMyThread.Destroy;
begin
  inherited;
  FParams.Free;
end;


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

Правда, если ты что-то огромное будешь в параметры пихать - то, конечно, два раза под это память выделять - тоже плохо.
Но это - палка о двух концах - либо дублирование, либо синхронизация.
...
Рейтинг: 0 / 0
30.03.2018, 18:09
    #39623528
YuRock
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Lazarus: выборка в потоке
stanilarможно синхронизировать датасурс с датасетом после завершения запроса (говоря по другому - передать всю бизнесс-логику в поток)?
Если "передать всю бизнесс-логику в поток" - то зачем тогда "синхронизировать датасурс с датасетом после завершения запроса"?

Или я не понял нифига.
...
Рейтинг: 0 / 0
30.03.2018, 19:49
    #39623561
Док
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Lazarus: выборка в потоке
YuRockСовсем универсально можно сделать так:
спасибо, я примерно так и реализовал, только без выделения промежуточного класса TMyParams, запихав передаваемые аргументы во внутренние поля доп. потока.

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


stanilarЗачем передавать какие-то параметры в поток, (что говорит о том, что бизнес-логика вне потока), когда можно синхронизировать датасурс с датасетом после завершения запроса (говоря по другому - передать всю бизнесс-логику в поток)?
не догнал. Поясни, плз.


stanilarМожно еще посоветовать Доку аналог omni thread под лазарь
отказался от проприетарного чужого кода принципиально.
...
Рейтинг: 0 / 0
30.03.2018, 19:58
    #39623563
Док
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Lazarus: выборка в потоке
DarkMasterА блобы и в MemoryStream можно запихнуть - я не думаю, что их у тебя (параметров в виде блоба), много будет - не самый распространненый вид данных.
бинарных м.б. и не так, а вот текстовых(с форматированием) - очень даже запросто.

Эти фишки я решил реализовать через доп.поток, т.к. в нынешней реализации клиента сохранение данных по локалке иногда "подвешивает" гуи секунд на 5-7, что совсем не комильфо.
...
Рейтинг: 0 / 0
30.03.2018, 20:00
    #39623565
stanilar
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Lazarus: выборка в потоке
YuRockзачем тогда "синхронизировать датасурс с датасетом после завершения запроса"

Показать данные на форме надо?
...
Рейтинг: 0 / 0
31.03.2018, 02:33
    #39623625
YuRock
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Lazarus: выборка в потоке
stanilarYuRockзачем тогда "синхронизировать датасурс с датасетом после завершения запроса"

Показать данные на форме надо?Откуда я знаю?
Док в этих темах, вообще-то, занимается именно реализацией бизнес-логики в доп. потоках. Поэтому как-то странно звучит совет "перенести бизнес-логику в доп. поток".
...
Рейтинг: 0 / 0
31.03.2018, 02:35
    #39623626
YuRock
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Lazarus: выборка в потоке
ДокПожалуй, отдам предпочтение наглядности в ущерб универсализму.Очевидно, у каждого своё представление о наглядности)
...
Рейтинг: 0 / 0
31.03.2018, 05:01
    #39623631
stanilar
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Lazarus: выборка в потоке
YuRockреализацией бизнес-логики в доп. потоках

Почему тогда поток данных(цитата: "передаете параметры запроса в поток") направлен в поток а не из потока?
...
Рейтинг: 0 / 0
31.03.2018, 05:17
    #39623632
stanilar
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Lazarus: выборка в потоке
ДокПоясни

Если бизнес-логика в потоке, то синхронизировать надо не передачу параметров в поток, а отображение полученных в потоке данных.
...
Рейтинг: 0 / 0
31.03.2018, 13:23
    #39623694
YuRock
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Lazarus: выборка в потоке
stanilarПочему тогда поток данных(цитата: "передаете параметры запроса в поток") направлен в поток а не из потока?Потому, что эти параметры нужны потоку перед началом работы, а не после?
...
Рейтинг: 0 / 0
31.03.2018, 13:24
    #39623695
YuRock
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Lazarus: выборка в потоке
stanilarДокПоясни

Если бизнес-логика в потоке, то синхронизировать надо не передачу параметров в поток, а отображение полученных в потоке данных.Синхронизировать надо и то, и другое. Если есть.
...
Рейтинг: 0 / 0
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Lazarus: выборка в потоке / 25 сообщений из 42, страница 1 из 2
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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