|
|
|
Lazarus: выборка в потоке
|
|||
|---|---|---|---|
|
#18+
как продолжение этой темы Не хочется изобреть свой велосипед. Хотел уточнить у тех, кто пользует этот вариант, как вы передаете параметры запроса в поток: 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 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.03.2018, 10:40 |
|
||
|
Lazarus: выборка в потоке
|
|||
|---|---|---|---|
|
#18+
Док, 1 вариант - наиболее прозрачный как по мне. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.03.2018, 11:14 |
|
||
|
Lazarus: выборка в потоке
|
|||
|---|---|---|---|
|
#18+
Вот такое читал? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.03.2018, 22:06 |
|
||
|
Lazarus: выборка в потоке
|
|||
|---|---|---|---|
|
#18+
stanilarВот такое читал? Пролистал статью, раньше ее не видел. Странная. 1. Вначале предлагается использование FreeOnTerminate, OnTerminate и Synchronize как панацею от всех бед, при этом не описываются связанные с этим грабли. Хотя статья времен D5, когда Synchronize работал через SendMessage, и граблей было поэтому меньше, но часть их была всё равно. 2. Потом, наконец, честно описываются обычные проблемы, которые возникают из-за использования вышепредложенного мусора, типа дэдлоков при WaitFor и Synchronize/OnTerminate, и героические пути их решения. При чем таким тоном, как будто эти муки - обычная необходимая вещь, рутина в жизни любого опытного программера. 3. И в конце - создание более-менее похожего на жизнеспособный примера без использования всего этого говна, и радостное заключение: "Мы достигли нашей цели!.. Не используется Synchronize. Потоки без необходимости не блокируются"! Да, неожиданный конец. Вернее, в реальной жизни всегда так - как ни пытайся сделать яичницу из теннисных шариков, всё равно придется сходить в магазин за яйцами. Но странно, когда статья изначально в споре зеленого и черного топит за зеленое, а заканчивается утверждением, что черное лучше. Вообще, впечатление, что автор статьи - мазохист. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.03.2018, 11:38 |
|
||
|
Lazarus: выборка в потоке
|
|||
|---|---|---|---|
|
#18+
По теме. 1-й вариант - нормальный. 3 параметра в конструктор потока, например. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.03.2018, 11:44 |
|
||
|
Lazarus: выборка в потоке
|
|||
|---|---|---|---|
|
#18+
YuRockПролистал статью, раньше ее не видел. Странная.Вообще-то это хрестоматийная книга по потокам в делфи, необходимая каждому, кто хочет научится ими пользоваться. А то потом плодятся с альтернативными подходами... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.03.2018, 14:45 |
|
||
|
Lazarus: выборка в потоке
|
|||
|---|---|---|---|
|
#18+
white_niggerВообще-то это хрестоматийная книга по потокам в делфи, необходимая каждому, кто хочет научится ими пользоваться Я в тебе и не сомневался ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.03.2018, 14:54 |
|
||
|
Lazarus: выборка в потоке
|
|||
|---|---|---|---|
|
#18+
white_niggerВообще-то это хрестоматийная книга по потокам в делфи все это читано и не раз. В статье даны основы, но вопрос в другом YuRock3 параметра в конструктор потока, например Скажем, если я буду пользовать конструкцию примерно такого вида Код: pascal 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. есть ли какие подводные камни, типа необходимости использования ZeroMemory и проч.? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.03.2018, 16:21 |
|
||
|
Lazarus: выборка в потоке
|
|||
|---|---|---|---|
|
#18+
Док, Не знаю, я лично не люблю в структурах автоматические типы. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.03.2018, 17:04 |
|
||
|
Lazarus: выборка в потоке
|
|||
|---|---|---|---|
|
#18+
Док, А почему нe: Код: pascal 1. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.03.2018, 17:11 |
|
||
|
Lazarus: выборка в потоке
|
|||
|---|---|---|---|
|
#18+
DarkMasterА почему нe: "Не аккуратненько" © На самом деле, я на стендовых проектиках сейчас в поток передаю что-то типа Array of TMyRec, только у структуры поля простые (стринги, целые, пойнтеры и проч.), потому что будет необходимость передавать и блобы. Конечно, хочется сделать какой-нибудь универсальный наследник потока. Но боюсь утонуть в его коде. Похоже, придется отделять мух от котлет :) Дело для меня новое, опыта нет. Вот и экспериментирую. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.03.2018, 17:26 |
|
||
|
Lazarus: выборка в потоке
|
|||
|---|---|---|---|
|
#18+
Док, Угу, а отдавать в поток array of Rec, который тоже где-то как-то заполняется - более красиво У меня хоть ясно видно, какой поток с какими параметрами зовется. А блобы и в MemoryStream можно запихнуть - я не думаю, что их у тебя (параметров в виде блоба), много будет - не самый распространненый вид данных. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.03.2018, 17:41 |
|
||
|
Lazarus: выборка в потоке
|
|||
|---|---|---|---|
|
#18+
white_niggerхрестоматийная книга Вот потому и дана ссылка. Что касается вопроса, то у меня возникло ощущение что архитектура будущего решения притягивается к способу реализации. Зачем передавать какие-то параметры в поток, (что говорит о том, что бизнес-логика вне потока), когда можно синхронизировать датасурс с датасетом после завершения запроса (говоря по другому - передать всю бизнесс-логику в поток)? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.03.2018, 17:46 |
|
||
|
Lazarus: выборка в потоке
|
|||
|---|---|---|---|
|
#18+
YuRockВообще, впечатление, что автор статьи - мазохист. Дай ссылку на лучшее. Не все хотят тратить свое время на изучения граблей, хотя такие знания и приветствуются. Но тем, кто во всем разобрался и поделился своими познаниями с остальными - честь и хвала. YuRockпредлагается использование FreeOnTerminate, OnTerminate и Synchronize Как по мне, так в статье предлагается понять, как абракадабра видит работу паскалистов с потоками. Сие учебное пособие достаточно корректно описывает особенности работы стандартных библиотек. P/S/ Можно еще посоветовать Доку аналог omni thread под лазарь, чтоб под влиянием кода от гуру программирования его дзен поразил бы нас своей красотой! Но вот увы - под лазарь мне такие библиотеки неизвестны. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.03.2018, 18:02 |
|
||
|
Lazarus: выборка в потоке
|
|||
|---|---|---|---|
|
#18+
ДокКонечно, хочется сделать какой-нибудь универсальный наследник потока. Универсальность обычно ухудшает функциональность. Совсем универсально можно сделать так: Код: 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. Таким образом Params для передачи в конструктор потока можно создавать перед созданием объекта потока и сразу удалять, а можно вообще объект Params общий держать (или несколько), только некоторые данные в нем менять (если в одном потоке)... И ничего не надо будет синхронизировать никогда (касательно этих Params). Правда, если ты что-то огромное будешь в параметры пихать - то, конечно, два раза под это память выделять - тоже плохо. Но это - палка о двух концах - либо дублирование, либо синхронизация. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.03.2018, 18:05 |
|
||
|
Lazarus: выборка в потоке
|
|||
|---|---|---|---|
|
#18+
stanilarможно синхронизировать датасурс с датасетом после завершения запроса (говоря по другому - передать всю бизнесс-логику в поток)? Если "передать всю бизнесс-логику в поток" - то зачем тогда "синхронизировать датасурс с датасетом после завершения запроса"? Или я не понял нифига. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.03.2018, 18:09 |
|
||
|
Lazarus: выборка в потоке
|
|||
|---|---|---|---|
|
#18+
YuRockСовсем универсально можно сделать так: спасибо, я примерно так и реализовал, только без выделения промежуточного класса TMyParams, запихав передаваемые аргументы во внутренние поля доп. потока. Пожалуй, отдам предпочтение наглядности в ущерб универсализму. Пусть лучше код будет индусским, зато проще потом сопровождать stanilarЗачем передавать какие-то параметры в поток, (что говорит о том, что бизнес-логика вне потока), когда можно синхронизировать датасурс с датасетом после завершения запроса (говоря по другому - передать всю бизнесс-логику в поток)? не догнал. Поясни, плз. stanilarМожно еще посоветовать Доку аналог omni thread под лазарь отказался от проприетарного чужого кода принципиально. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.03.2018, 19:49 |
|
||
|
Lazarus: выборка в потоке
|
|||
|---|---|---|---|
|
#18+
DarkMasterА блобы и в MemoryStream можно запихнуть - я не думаю, что их у тебя (параметров в виде блоба), много будет - не самый распространненый вид данных. бинарных м.б. и не так, а вот текстовых(с форматированием) - очень даже запросто. Эти фишки я решил реализовать через доп.поток, т.к. в нынешней реализации клиента сохранение данных по локалке иногда "подвешивает" гуи секунд на 5-7, что совсем не комильфо. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.03.2018, 19:58 |
|
||
|
Lazarus: выборка в потоке
|
|||
|---|---|---|---|
|
#18+
YuRockзачем тогда "синхронизировать датасурс с датасетом после завершения запроса" Показать данные на форме надо? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.03.2018, 20:00 |
|
||
|
Lazarus: выборка в потоке
|
|||
|---|---|---|---|
|
#18+
stanilarYuRockзачем тогда "синхронизировать датасурс с датасетом после завершения запроса" Показать данные на форме надо?Откуда я знаю? Док в этих темах, вообще-то, занимается именно реализацией бизнес-логики в доп. потоках. Поэтому как-то странно звучит совет "перенести бизнес-логику в доп. поток". ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 31.03.2018, 02:33 |
|
||
|
Lazarus: выборка в потоке
|
|||
|---|---|---|---|
|
#18+
ДокПожалуй, отдам предпочтение наглядности в ущерб универсализму.Очевидно, у каждого своё представление о наглядности) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 31.03.2018, 02:35 |
|
||
|
Lazarus: выборка в потоке
|
|||
|---|---|---|---|
|
#18+
YuRockреализацией бизнес-логики в доп. потоках Почему тогда поток данных(цитата: "передаете параметры запроса в поток") направлен в поток а не из потока? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 31.03.2018, 05:01 |
|
||
|
Lazarus: выборка в потоке
|
|||
|---|---|---|---|
|
#18+
ДокПоясни Если бизнес-логика в потоке, то синхронизировать надо не передачу параметров в поток, а отображение полученных в потоке данных. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 31.03.2018, 05:17 |
|
||
|
Lazarus: выборка в потоке
|
|||
|---|---|---|---|
|
#18+
stanilarПочему тогда поток данных(цитата: "передаете параметры запроса в поток") направлен в поток а не из потока?Потому, что эти параметры нужны потоку перед началом работы, а не после? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 31.03.2018, 13:23 |
|
||
|
Lazarus: выборка в потоке
|
|||
|---|---|---|---|
|
#18+
stanilarДокПоясни Если бизнес-логика в потоке, то синхронизировать надо не передачу параметров в поток, а отображение полученных в потоке данных.Синхронизировать надо и то, и другое. Если есть. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 31.03.2018, 13:24 |
|
||
|
Lazarus: выборка в потоке
|
|||
|---|---|---|---|
|
#18+
YuRockпараметры нужны потоку перед началом работы Параметры запросов не часть бизнес-логики клиента БД? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 31.03.2018, 17:30 |
|
||
|
Lazarus: выборка в потоке
|
|||
|---|---|---|---|
|
#18+
Док Не находишь, что вопрос про "как вы передаете параметры запроса в поток" превратился в "как вы передаете параметры в конструктор класса"? З.Ы. Может есть возможность решить проблему на уровне общей архитектуры: перевести датасеты в асинхронный режим, а потоки оставить там, где они действительно нужны? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 31.03.2018, 17:43 |
|
||
|
Lazarus: выборка в потоке
|
|||
|---|---|---|---|
|
#18+
stanilarНе находишь, что вопрос про "как вы передаете параметры запроса в поток" превратился в "как вы передаете параметры в конструктор класса"? нет, первое - частный случай второго. Именно он меня и интересует. stanilarперевести датасеты в асинхронный режим, а потоки оставить там, где они действительно нужны? мне не нужны параллельные вычисления. Мне нужен "незамерзающий" гуй. Вся бизнес-логика заключается в частом одномоментном сохранении большого объема данных в БД, которое порой занимает довольно ощутимый промежуток времени. YuRockОчевидно, у каждого своё представление о наглядности) сейчас, просматривая свой код 5-7 летней давности, я иногда называю себя нехорошими словами, как будто он код писан другим человеком :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 31.03.2018, 19:12 |
|
||
|
Lazarus: выборка в потоке
|
|||
|---|---|---|---|
|
#18+
stanilarYuRockпараметры нужны потоку перед началом работы Параметры запросов не часть бизнес-логики клиента БД?В том-то и дело. Но вводятся-то они в другом потоке по любому. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 31.03.2018, 20:40 |
|
||
|
Lazarus: выборка в потоке
|
|||
|---|---|---|---|
|
#18+
Докпервое - частный случай второго Нет. Но спорить не буду. Докчастный случай второго. Именно он меня и интересует Ну и зачем тут потоки? Докбизнес-логика заключается в частом одномоментном сохранении большого объема данных в БД Может скинуть во временные файлы (винда их сама умеет удалять) и передать стороннему приложению для записи в БД? А то ведь создается впечатление, что ты идешь очень опасным путем, играясь с экспериментальным компилятором, с неоднозначной реализацией потоков в разных ОС(ты ведь не пользуешь WINE для порта виндового исходника программы в линух), в которых экспериментальным отладчик может и не показать тебе ошибку, так еще и игнорируешь опыт тех, кто уже шел до тебя: Lazarus: коннект в потоке совет №3 (Таки вместе задачи решать веселее, особенно с профессиональным коллегой). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 31.03.2018, 22:44 |
|
||
|
Lazarus: выборка в потоке
|
|||
|---|---|---|---|
|
#18+
stanilarМожет скинуть во временные файлы (винда их сама умеет удалять) и передать стороннему приложению для записи в БД? я уже пытался в основном потоке писать изменяемые данные в GTT и в пишущей транзакции сохранять их в базе - все равно долго. Думаешь время записи-чтения на/с винта будет меньше? И потом, надо будет заморачиваться с проверкой прав на временную папку (и это, как минимум в двух ОСях) и/или проверкой свободного места на диске. Нафиг. stanilarА то ведь создается впечатление, что ты идешь очень опасным путем, играясь с экспериментальным компилятором, с неоднозначной реализацией потоков в разных ОС я просто экспериментирую, ибо не имел раньше опыта. Все, что пишется мне в ответах, я внимательно читаю. Про сторонний код я уже говорил. Я даже бесплатный wadman'овский безопасный код выпилил из своих ранних исходников, как только немного разобрался с кухней доп.потоков. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.04.2018, 01:28 |
|
||
|
Lazarus: выборка в потоке
|
|||
|---|---|---|---|
|
#18+
Док Код: pascal 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. а откуда брать коннект? куда записывать результаты выполнения запроса и ошибки? зы читаю этот топик, топик по ссылке в первом посте и некоторые рядом, и чет офигеваю как тут все сложно ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.04.2018, 07:55 |
|
||
|
Lazarus: выборка в потоке
|
|||
|---|---|---|---|
|
#18+
Дегтярев Евгенийчет офигеваю как тут все сложно ничего сложного нет, достаточно немного абстрагироваться от привычной схемы коннекта. В доп.поток передается мемори датасет (посредством чего данные возвращаются в основной поток) и параметры коннекта и запроса, все остальное создается в доп.потоке в runtime :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.04.2018, 09:17 |
|
||
|
Lazarus: выборка в потоке
|
|||
|---|---|---|---|
|
#18+
коннект создается каждый раз? про сложность это я имел ввиду терки в нескольких топиках про многопоточность ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.04.2018, 10:18 |
|
||
|
Lazarus: выборка в потоке
|
|||
|---|---|---|---|
|
#18+
Дегтярев Евгенийконнект создается каждый раз? да: каждый раз на insert-update-delete Дегтярев Евгенийтерки в нескольких топиках законы жанра как бэ... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.04.2018, 15:39 |
|
||
|
Lazarus: выборка в потоке
|
|||
|---|---|---|---|
|
#18+
Док, авторда: каждый раз на insert-update-delete в хп может вынести? я у себя в одной программе понаблюдал за запросами, которые сам же и делал, и утащил сразу 5 запросов в одну хп. по скорости не мерял, но код стал явно лучше и чище. скорее всего и скорость улучшилась. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.04.2018, 18:24 |
|
||
|
Lazarus: выборка в потоке
|
|||
|---|---|---|---|
|
#18+
makhaonв хп может вынести? а смысл? Те же n-цать запросов я могу и на клиенте в одну процедуру затолкать... Собственно, я для себя уже определился. Тему можно считать исчерпанной. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.04.2018, 22:16 |
|
||
|
Lazarus: выборка в потоке
|
|||
|---|---|---|---|
|
#18+
Дока смысл? Те же n-цать запросов я могу и на клиенте в одну процедуру затолкать...Ну, смысл большой. Сервер откомпилирует ее как одно целое один раз заранее. А не будет компилировать n-цать запросов каждый раз. Плюс не будет накладных расходов на кучу сетевых запросов. Будет намного быстрее. Если запросы быстрые (как и должно быть) - может быстрее в разы, а то и на порядки (зависит от n, сети, скорости компиляции и выполнения запросов, размера базы...). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.04.2018, 02:18 |
|
||
|
Lazarus: выборка в потоке
|
|||
|---|---|---|---|
|
#18+
ДокДегтярев Евгенийконнект создается каждый раз? да: каждый раз на insert-update-delete не накладно будет для сервера на каждый запрос поднимать и тушить соединение? если запросы не по минуте выполняются, я бы держал отдельно открытое соединение и передавал его в поток. если потоков несколько, то в идеале пул коннектов ДокДегтярев Евгенийтерки в нескольких топиках законы жанра как бэ... да просто поразился масштабам, в свое время на делфи многопоточкой не интересовался, поэтому не в теме сейчас на go, для синхронизации достаточно пары примитивов, правда там без gui ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.04.2018, 07:15 |
|
||
|
Lazarus: выборка в потоке
|
|||
|---|---|---|---|
|
#18+
Дегтярев Евгений, делфёвые циклы, к слову, распарраллеливаются в две-три строки кода. если тело циклов может работать как многопоточное. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.04.2018, 09:40 |
|
||
|
Lazarus: выборка в потоке
|
|||
|---|---|---|---|
|
#18+
makhaon, а мжно пример? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.04.2018, 10:42 |
|
||
|
Lazarus: выборка в потоке
|
|||
|---|---|---|---|
|
#18+
Дегтярев Евгений, ну, например, многопоточное чтение файлов у меня: Код: pascal 1. 2. 3. 4. 5. 6. 7. 8. 9. EnsureSliceOpened - довольно некислая процедура, тысяч в 20 строк. паресер довольно толстый + обвязка. Ускорилось раз в 6-7 на i7-м. Библиотеку я уже не единожды кидал, ищи. Библиотека довольно компактная. В новых средах есть встроенная аналогичная. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.04.2018, 14:53 |
|
||
|
|

start [/forum/topic.php?all=1&fid=58&tid=2041061]: |
0ms |
get settings: |
7ms |
get forum list: |
17ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
173ms |
get topic data: |
9ms |
get forum data: |
3ms |
get page messages: |
78ms |
get tp. blocked users: |
1ms |
| others: | 235ms |
| total: | 529ms |

| 0 / 0 |
