|
|
|
Lazarus: коннект в потоке
|
|||
|---|---|---|---|
|
#18+
YuRock, который вообщеиспользовать нельзя категорически, т.к. он как минимум: 1) замораживает очередь сообщений vcl-потока до обработки всех методов, вызванных в Synchronize во всех потоках; 2) Может приводит к существенной (неизвестно, какой, возможно и бесконечной - зависит от обработчика сообщения, находящегося в очереди) задержке перед вызовом метода, но это ладно; 3) может вообще не вызваться, что приведет ко многим интересным последствиям, любое из которых - полный крах всей логики приложения.Пункт 1, это преодоление барьера конвеера команд ядра процессора, необходимое для реализации полной синхронизации. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.05.2017, 13:08 |
|
||
|
Lazarus: коннект в потоке
|
|||
|---|---|---|---|
|
#18+
rdb_devПункт 1, это преодоление барьера конвеера команд ядра процессора, необходимое для реализации полной синхронизации. Ну отлично. Преодолевайте, кому хочется. Мне ни разу в жизни не понадобилось видимо "преодолевать барьер конвеера". ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.05.2017, 13:14 |
|
||
|
Lazarus: коннект в потоке
|
|||
|---|---|---|---|
|
#18+
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 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.05.2017, 13:29 |
|
||
|
Lazarus: коннект в потоке
|
|||
|---|---|---|---|
|
#18+
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, а тем более к теме топика, такое же отношение, как послезавтрашний футбольный матч Шахтёр-Динамо к выборам президента Сербии. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.05.2017, 13:49 |
|
||
|
Lazarus: коннект в потоке
|
|||
|---|---|---|---|
|
#18+
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 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.05.2017, 15:32 |
|
||
|
Lazarus: коннект в потоке
|
|||
|---|---|---|---|
|
#18+
rdb_dev, Для "общего понимания процесса", которое тут и так у всех было и есть, в т.ч. у ТС, достаточно понятия "синхронная работа с ресурсом", где "синхронная" - означает невозможность чтения и записи в ресурс одновременно в более, чем одном потоке. Какими средствами достигается подобная синхронность - с помощью логики приложения и/или Functions that enter or leave critical sections Functions that signal synchronization objects Wait functions Interlocked functions Я вообще зря вклинился в топик, увидев совет использовать TThread.Synchronize. Для меня это красная тряпка, каюсь. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.05.2017, 16:23 |
|
||
|
Lazarus: коннект в потоке
|
|||
|---|---|---|---|
|
#18+
YuRockЯ вообще зря вклинился в топик, увидев совет использовать TThread.Synchronize. Для меня это красная тряпка, каюсь.Негативный опыт? :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.05.2017, 16:43 |
|
||
|
Lazarus: коннект в потоке
|
|||
|---|---|---|---|
|
#18+
rdb_devYuRockЯ вообще зря вклинился в топик, увидев совет использовать TThread.Synchronize. Для меня это красная тряпка, каюсь.Негативный опыт? :) Немного очень давно, но скорее невозможность позитивного. Как, например, и в галочке "Auto create forms", установленной по умолчанию. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.05.2017, 17:17 |
|
||
|
Lazarus: коннект в потоке
|
|||
|---|---|---|---|
|
#18+
YuRockЕще менее важно, чем высокие понятия типа "барьера конвеЙера".В общем-то, я не совсем корректно употребил словосочетание "барьер конвейера", так как само понятие "барьера памяти" при выполнении таких команд процессора, как mfence, sfence и lfence подразумевает полное завершение всех предыдущих команд процессора работы с памятью, включая сброс информации из кэша в память и не допуская начала выполнения новых до момента, пока не будет пройден "барьер". ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.05.2017, 10:42 |
|
||
|
Lazarus: коннект в потоке
|
|||
|---|---|---|---|
|
#18+
Апну ветку, чтобы не плодить новую. На форме в ГУИ лежит мемори-датасет (RDM), который надо заполнить в доп.потоке выборкой из базы. Пока сделал так: создал в потоке коннект, в созданный там же датасет забрал данные из БД и там же в доп.потоке заполнил значениями гуишный RDM. Насколько это потокобезопасно? Как реальные поцоны это делают по феншую? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.02.2018, 10:05 |
|
||
|
Lazarus: коннект в потоке
|
|||
|---|---|---|---|
|
#18+
ДокКак реальные поцоны это делают по феншую? Не знаю, как посоны, но я-бы на момент заполнения датасета отключил-бы его от визуальной части (datasource.dataset = nil) и подключил-бы только в основном потоке по факту заполнения. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.02.2018, 10:19 |
|
||
|
Lazarus: коннект в потоке
|
|||
|---|---|---|---|
|
#18+
wadman, в принципе, я так и сделал Код: pascal 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. а в остальном все верно? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.02.2018, 10:22 |
|
||
|
Lazarus: коннект в потоке
|
|||
|---|---|---|---|
|
#18+
Дока в остальном все верно? Не, ты не так сделал. Просто отключил "управление", что не мешает гриду обращаться к датасету в основном потоке. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.02.2018, 10:25 |
|
||
|
Lazarus: коннект в потоке
|
|||
|---|---|---|---|
|
#18+
wadman, ок, учту. Спасибо. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.02.2018, 10:27 |
|
||
|
Lazarus: коннект в потоке
|
|||
|---|---|---|---|
|
#18+
Еще вопрос. Скажем, табля в базе содержит несколько десятков килозаписей. Чтобы не тащить все на клиента (в датасете FetchAll = False), я запросом (в доп.потоке) забираю первые 100-200, примерно так: Код: pascal 1. 2. 3. При прокрутке в гриде мне нужно получить следующую порцию для отображения. Как это сделать технически? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.02.2018, 10:54 |
|
||
|
Lazarus: коннект в потоке
|
|||
|---|---|---|---|
|
#18+
ДокКак это сделать технически? Хранить счетчик загруженных строк и на момент достижения нижней границы грузить фоном следующие N записей. Плюс добавить флаг, что все данные выбраны, чтоб лишний раз не дергать запрос. См. SELECT FIRST SKIP https://firebirdsql.org/refdocs/langrefupd20-select.html Отцеплять datasource или нет (или выключать грид) - решай сам, по тестированию. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.02.2018, 11:00 |
|
||
|
Lazarus: коннект в потоке
|
|||
|---|---|---|---|
|
#18+
Хотя, может FB сам фетчит по одной записи? Тогда в потоке особой нужды нет. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.02.2018, 11:01 |
|
||
|
Lazarus: коннект в потоке
|
|||
|---|---|---|---|
|
#18+
wadmanХотя, может FB сам фетчит по одной записи? Тогда в потоке особой нужды нет. А, я забыл, что ты данные в памяти держишь. :) Тогда как выше описал. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.02.2018, 11:02 |
|
||
|
Lazarus: коннект в потоке
|
|||
|---|---|---|---|
|
#18+
Док, грид сам разве не заберет? или нужно забирать в доп. потоке? авторсоздал в потоке коннект Насколько я знаю - можно создавать в любом потоке. Только что доступаться потом можно только из одного одновременно. То есть - не обязательно его именно в доп. потоке создавать. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.02.2018, 11:11 |
|
||
|
Lazarus: коннект в потоке
|
|||
|---|---|---|---|
|
#18+
makhaon, в доп.потоке только для меморидатасета. В принципе можно для этого случая и все записи фетчить (в основном у меня это справочники). А вот если открывать обычный датасет с парой десятков тыс.записей в основном потоке (да еще и со всякими многоэтажными джойнами внутри), то гуи заметно лагает. Потому и задался вопросом: сразу грузить все, но в доп.потоке, или подгрузить сначала в основном пару сотен. Вот дальше не помню, грид, используя этот же запрос с select first, сам подгрузит следующую сотню или это надо делать принудительно :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.02.2018, 12:25 |
|
||
|
Lazarus: коннект в потоке
|
|||
|---|---|---|---|
|
#18+
wadmanХотя, может FB сам фетчит по одной записи? Тогда в потоке особой нужды нет. Помнится, недавно был разговор за полноценный сервер, что он пачками отдает записи. Вот для эмбеддед да, каждый раз будет отдаваться по одной записи, если я правильно понял. Наверно в этом случае лаги будут? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.02.2018, 12:29 |
|
||
|
Lazarus: коннект в потоке
|
|||
|---|---|---|---|
|
#18+
ДокВот дальше не помню, грид, используя этот же запрос с select first, сам подгрузит следующую сотню или это надо делать принудительно :) Как он подгрузит, если запрос возвращает те строки, которые ограничены first и больше быть не должно? Грузить "руками" и порциями это как раз для мемдатасета. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.02.2018, 12:57 |
|
||
|
Lazarus: коннект в потоке
|
|||
|---|---|---|---|
|
#18+
wadmanКак он подгрузит, если запрос возвращает те строки, которые ограничены first и больше быть не должно? Логично. У RxDBGrid есть фишка фетчить помещающиеся на экране записи. Надо будет поэкспериментировать и так, и сяк. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.02.2018, 16:03 |
|
||
|
Lazarus: коннект в потоке
|
|||
|---|---|---|---|
|
#18+
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. но событие срабатывает при первом же подключении к датасету с зацикливанием фетча записей до полной выборки ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.02.2018, 00:24 |
|
||
|
Lazarus: коннект в потоке
|
|||
|---|---|---|---|
|
#18+
Мужики, кто как делает, посоветуйте. Размер выборки ограничивается параметрами FIRST/SKIP (FB3). SKIP увеличивается/уменьшается соответственно тому, куда скроллится грид. Наступает момент, когда SKIP превышает число записей в таблице БД (датасет при этом IsEmpty). Хотел спросить, как проконтроллировать возврат пустого датасета? завести в доп.потоке еще один датасет (тогда лишний коннект при каждой новой порции фетча)? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.02.2018, 18:44 |
|
||
|
|

start [/forum/topic.php?fid=58&msg=39600968&tid=2041189]: |
0ms |
get settings: |
8ms |
get forum list: |
19ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
164ms |
get topic data: |
12ms |
get forum data: |
3ms |
get page messages: |
91ms |
get tp. blocked users: |
1ms |
| others: | 248ms |
| total: | 552ms |

| 0 / 0 |
