powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Lazarus: выборка в потоке
25 сообщений из 42, страница 1 из 2
Lazarus: выборка в потоке
    #39622491
Фотография Док
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
как продолжение этой темы

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

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
Lazarus: выборка в потоке
    #39622522
Фотография DarkMaster
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Док,

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

Вообще, впечатление, что автор статьи - мазохист.
...
Рейтинг: 0 / 0
Lazarus: выборка в потоке
    #39623149
YuRock
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
По теме.
1-й вариант - нормальный. 3 параметра в конструктор потока, например.
...
Рейтинг: 0 / 0
Lazarus: выборка в потоке
    #39623323
white_nigger
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
YuRockПролистал статью, раньше ее не видел. Странная.Вообще-то это хрестоматийная книга по потокам в делфи, необходимая каждому, кто хочет научится ими пользоваться. А то потом плодятся с альтернативными подходами...
...
Рейтинг: 0 / 0
Lazarus: выборка в потоке
    #39623336
YuRock
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
white_niggerВообще-то это хрестоматийная книга по потокам в делфи, необходимая каждому, кто хочет научится ими пользоваться
Я в тебе и не сомневался
...
Рейтинг: 0 / 0
Lazarus: выборка в потоке
    #39623430
Фотография Док
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
Lazarus: выборка в потоке
    #39623480
YuRock
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Док,

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

А почему нe:

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

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

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

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

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

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


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

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

P/S/

Можно еще посоветовать Доку аналог omni thread под лазарь, чтоб под влиянием кода от гуру программирования его дзен поразил бы нас своей красотой! Но вот увы - под лазарь мне такие библиотеки неизвестны.
...
Рейтинг: 0 / 0
Lazarus: выборка в потоке
    #39623524
YuRock
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ДокКонечно, хочется сделать какой-нибудь универсальный наследник потока.
Универсальность обычно ухудшает функциональность.
Совсем универсально можно сделать так:
Код: 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
Lazarus: выборка в потоке
    #39623528
YuRock
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
stanilarможно синхронизировать датасурс с датасетом после завершения запроса (говоря по другому - передать всю бизнесс-логику в поток)?
Если "передать всю бизнесс-логику в поток" - то зачем тогда "синхронизировать датасурс с датасетом после завершения запроса"?

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

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


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


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

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

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

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

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

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

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


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