powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Lazarus: коннект в потоке
25 сообщений из 125, страница 3 из 5
Lazarus: коннект в потоке
    #39458816
rdb_dev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
YuRock, который вообщеиспользовать нельзя категорически, т.к. он как минимум:
1) замораживает очередь сообщений vcl-потока до обработки всех методов, вызванных в Synchronize во всех потоках;
2) Может приводит к существенной (неизвестно, какой, возможно и бесконечной - зависит от обработчика сообщения, находящегося в очереди) задержке перед вызовом метода, но это ладно;
3) может вообще не вызваться, что приведет ко многим интересным последствиям, любое из которых - полный крах всей логики приложения.Пункт 1, это преодоление барьера конвеера команд ядра процессора, необходимое для реализации полной синхронизации.
...
Рейтинг: 0 / 0
Lazarus: коннект в потоке
    #39458820
YuRock
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
rdb_devПункт 1, это преодоление барьера конвеера команд ядра процессора, необходимое для реализации полной синхронизации.
Ну отлично. Преодолевайте, кому хочется. Мне ни разу в жизни не понадобилось видимо "преодолевать барьер конвеера".
...
Рейтинг: 0 / 0
Lazarus: коннект в потоке
    #39458846
rdb_dev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
...
Рейтинг: 0 / 0
Lazarus: коннект в потоке
    #39458873
YuRock
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
rdb_dev http://lxr.linux.no/linux v2.6.36/Documentation/memory-barriers.txt
http://www.rdrop.com/users/paulmck/scalability/paper/whymb.2010.07.23a.pdf
Эти ссылки имеют к TThread.Synchronize, а тем более к теме топика, такое же отношение, как послезавтрашний футбольный матч Шахтёр-Динамо к выборам президента Сербии.
...
Рейтинг: 0 / 0
Lazarus: коннект в потоке
    #39458967
rdb_dev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
YuRock, эти ссылки я привел для общего понимания процесса. В своей реализации метод Synchronize использует мьютексы и критические секции, которые, в свою очередь, используют реализацию барьеров памяти. К примеру, на MSDN явно указано:

The following synchronization functions use the appropriate barriers to ensure memory ordering:
Functions that enter or leave critical sections
Functions that signal synchronization objects
Wait functions
Interlocked functions
...
Рейтинг: 0 / 0
Lazarus: коннект в потоке
    #39459013
YuRock
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
rdb_dev,

Для "общего понимания процесса", которое тут и так у всех было и есть, в т.ч. у ТС, достаточно понятия "синхронная работа с ресурсом", где "синхронная" - означает невозможность чтения и записи в ресурс одновременно в более, чем одном потоке.
Какими средствами достигается подобная синхронность - с помощью логики приложения и/или
Functions that enter or leave critical sections
Functions that signal synchronization objects
Wait functions
Interlocked functions
, вообще не важно в данном случае. Еще менее важно, чем высокие понятия типа "барьера конвеЙера".

Я вообще зря вклинился в топик, увидев совет использовать TThread.Synchronize. Для меня это красная тряпка, каюсь.
...
Рейтинг: 0 / 0
Lazarus: коннект в потоке
    #39459030
rdb_dev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
YuRockЯ вообще зря вклинился в топик, увидев совет использовать TThread.Synchronize. Для меня это красная тряпка, каюсь.Негативный опыт? :)
...
Рейтинг: 0 / 0
Lazarus: коннект в потоке
    #39459068
YuRock
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
rdb_devYuRockЯ вообще зря вклинился в топик, увидев совет использовать TThread.Synchronize. Для меня это красная тряпка, каюсь.Негативный опыт? :)
Немного очень давно, но скорее невозможность позитивного. Как, например, и в галочке "Auto create forms", установленной по умолчанию.
...
Рейтинг: 0 / 0
Lazarus: коннект в потоке
    #39459412
rdb_dev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
YuRockЕще менее важно, чем высокие понятия типа "барьера конвеЙера".В общем-то, я не совсем корректно употребил словосочетание "барьер конвейера", так как само понятие "барьера памяти" при выполнении таких команд процессора, как mfence, sfence и lfence подразумевает полное завершение всех предыдущих команд процессора работы с памятью, включая сброс информации из кэша в память и не допуская начала выполнения новых до момента, пока не будет пройден "барьер".
...
Рейтинг: 0 / 0
Lazarus: коннект в потоке
    #39600968
Фотография Док
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Апну ветку, чтобы не плодить новую.

На форме в ГУИ лежит мемори-датасет (RDM), который надо заполнить в доп.потоке выборкой из базы.

Пока сделал так: создал в потоке коннект, в созданный там же датасет забрал данные из БД и там же в доп.потоке заполнил значениями гуишный RDM.

Насколько это потокобезопасно? Как реальные поцоны это делают по феншую?
...
Рейтинг: 0 / 0
Lazarus: коннект в потоке
    #39600978
Фотография wadman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ДокКак реальные поцоны это делают по феншую?
Не знаю, как посоны, но я-бы на момент заполнения датасета отключил-бы его от визуальной части (datasource.dataset = nil) и подключил-бы только в основном потоке по факту заполнения.
...
Рейтинг: 0 / 0
Lazarus: коннект в потоке
    #39600979
Фотография Док
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
wadman,

в принципе, я так и сделал
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
procedure TFrmMain.btnAddClick(Sender: TObject);
begin
  FMyThread := TMyThread.Create(True);
  try
    RMD.DisableControls;

    FrmSplash := TFrmSplash.Create(Application);
    FMyThread.Start;
    try
      FrmSplash.ShowModal;
    finally
      FreeAndNil(FrmSplash);
    end;
  finally
    RMD.EnableControls;
    FreeAndNil(FMyThread);
  end;
end;


а в остальном все верно?
...
Рейтинг: 0 / 0
Lazarus: коннект в потоке
    #39600983
Фотография wadman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Дока в остальном все верно?
Не, ты не так сделал. Просто отключил "управление", что не мешает гриду обращаться к датасету в основном потоке.
...
Рейтинг: 0 / 0
Lazarus: коннект в потоке
    #39600984
Фотография Док
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
wadman,

ок, учту. Спасибо.
...
Рейтинг: 0 / 0
Lazarus: коннект в потоке
    #39600992
Фотография Док
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Еще вопрос. Скажем, табля в базе содержит несколько десятков килозаписей. Чтобы не тащить все на клиента (в датасете FetchAll = False), я запросом (в доп.потоке) забираю первые 100-200, примерно так:
Код: pascal
1.
2.
3.
SELECT FIRST 200 *
FROM TBL_TEST
ORDER BY 1 


При прокрутке в гриде мне нужно получить следующую порцию для отображения. Как это сделать технически?
...
Рейтинг: 0 / 0
Lazarus: коннект в потоке
    #39601000
Фотография wadman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ДокКак это сделать технически?
Хранить счетчик загруженных строк и на момент достижения нижней границы грузить фоном следующие N записей. Плюс добавить флаг, что все данные выбраны, чтоб лишний раз не дергать запрос.
См. SELECT FIRST SKIP https://firebirdsql.org/refdocs/langrefupd20-select.html
Отцеплять datasource или нет (или выключать грид) - решай сам, по тестированию.
...
Рейтинг: 0 / 0
Lazarus: коннект в потоке
    #39601001
Фотография wadman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Хотя, может FB сам фетчит по одной записи? Тогда в потоке особой нужды нет.
...
Рейтинг: 0 / 0
Lazarus: коннект в потоке
    #39601003
Фотография wadman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
wadmanХотя, может FB сам фетчит по одной записи? Тогда в потоке особой нужды нет.
А, я забыл, что ты данные в памяти держишь. :)
Тогда как выше описал.
...
Рейтинг: 0 / 0
Lazarus: коннект в потоке
    #39601013
Фотография makhaon
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Док,

грид сам разве не заберет? или нужно забирать в доп. потоке?

авторсоздал в потоке коннект

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

в доп.потоке только для меморидатасета. В принципе можно для этого случая и все записи фетчить (в основном у меня это справочники).

А вот если открывать обычный датасет с парой десятков тыс.записей в основном потоке (да еще и со всякими многоэтажными джойнами внутри), то гуи заметно лагает. Потому и задался вопросом: сразу грузить все, но в доп.потоке, или подгрузить сначала в основном пару сотен. Вот дальше не помню, грид, используя этот же запрос с select first, сам подгрузит следующую сотню или это надо делать принудительно :)
...
Рейтинг: 0 / 0
Lazarus: коннект в потоке
    #39601061
Фотография Док
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
wadmanХотя, может FB сам фетчит по одной записи? Тогда в потоке особой нужды нет.
Помнится, недавно был разговор за полноценный сервер, что он пачками отдает записи. Вот для эмбеддед да, каждый раз будет отдаваться по одной записи, если я правильно понял. Наверно в этом случае лаги будут?
...
Рейтинг: 0 / 0
Lazarus: коннект в потоке
    #39601085
Фотография wadman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ДокВот дальше не помню, грид, используя этот же запрос с select first, сам подгрузит следующую сотню или это надо делать принудительно :)
Как он подгрузит, если запрос возвращает те строки, которые ограничены first и больше быть не должно?
Грузить "руками" и порциями это как раз для мемдатасета.
...
Рейтинг: 0 / 0
Lazarus: коннект в потоке
    #39601259
Фотография Док
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
wadmanКак он подгрузит, если запрос возвращает те строки, которые ограничены first и больше быть не должно?
Логично.
У RxDBGrid есть фишка фетчить помещающиеся на экране записи. Надо будет поэкспериментировать и так, и сяк.
...
Рейтинг: 0 / 0
Lazarus: коннект в потоке
    #39603378
Фотография Док
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
wadmanХранить счетчик загруженных строк и на момент достижения нижней границы грузить фоном следующие N записей.
Вот тут загвоздка. Где отслеживать условие BOF или EOF датасета? Пробовал в OnDataChange датасорса,
Код: 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.
procedure TFrmMain.DSDataChange(Sender: TObject; Field: TField);
begin
  if Qry.Active then
  begin
    if Qry.EOF then
    begin
      FprmFrom:= FprmTo + 1;
      FprmTo:= FprmFrom + RecInterval;

      //if (Qry.RecordCount - FprmFrom) < RecInterval then
      //begin
      //  FprmFrom:= Qry.RecordCount - RecInterval;
      //  FprmTo:= Qry.RecordCount;
      //end;

    end;

    if Qry.BOF then
    begin
      FprmTo:= FprmFrom - 1;
      FprmFrom:= FprmTo - RecInterval;

      if FprmFrom < 1 then
      begin
        FprmFrom:= 1;
        FprmTo:= FprmFrom + RecInterval;
      end;

    end;
    btnAddClick(Sender);//фетч датасета с параметрами в доп.потоке
  end;
end;


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

Размер выборки ограничивается параметрами FIRST/SKIP (FB3). SKIP увеличивается/уменьшается соответственно тому, куда скроллится грид. Наступает момент, когда SKIP превышает число записей в таблице БД (датасет при этом IsEmpty).

Хотел спросить, как проконтроллировать возврат пустого датасета? завести в доп.потоке еще один датасет (тогда лишний коннект при каждой новой порции фетча)?
...
Рейтинг: 0 / 0
25 сообщений из 125, страница 3 из 5
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Lazarus: коннект в потоке
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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