|
|
|
Lazarus: коннект в потоке
|
|||
|---|---|---|---|
|
#18+
Мужики, хотел внести для себя ясность в вопросе, которым только начал заниматься. В приложении на главной форме FrmMain лежит TIBDatabase. Делаю коннект потоке (схематично) Код: pascal 1. 2. 3. 4. 5. 6. 7. 8. Соответственным образом коннекчусь к таблям. Под виндой проблем нет, под никсами приложение валится через раз. Поэтому хотел уточнить, это корректный код? Если создавать компоненты доступа динамически (объявив, как приватные поля класса TMyThread, типа FIBDatabase), то после уничтожения этого экземпляра потока FIBDatabase тоже умрет? ================= Док. Win7 Ultim x64/Deb 8.7 i386: FB 3.0.2.32703, диалект 3, SS(win)/SC(Deb), Lazarus 1.9(r.54844); FPC 3.1.1 (r.36160), IBX by -Rik-; IBE 2016.5.14.1 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.05.2017, 08:55 |
|
||
|
Lazarus: коннект в потоке
|
|||
|---|---|---|---|
|
#18+
В потоке только подключение? Как потом с базой идет работа? Как форма узнает о результате? Докпосле уничтожения этого экземпляра потока FIBDatabase тоже умрет? Вряд-ли, т.к. поток не компонент. Его не указать владельцем (чтоб он всех своих за собой "забрал"). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.05.2017, 09:03 |
|
||
|
Lazarus: коннект в потоке
|
|||
|---|---|---|---|
|
#18+
wadmanВ потоке только подключение? нет, там работа с таблями: селекты, апдейты, выполнение процедур на сервере wadmanКак форма узнает о результате? о каком результате речь? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.05.2017, 09:31 |
|
||
|
Lazarus: коннект в потоке
|
|||
|---|---|---|---|
|
#18+
Доко каком результате речь? О результате работы потока. База-то на форме? П.С. Если работа вся в потоке, то я-бы все необходимое для этой работы в потоке и создавал/удалял. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.05.2017, 09:34 |
|
||
|
Lazarus: коннект в потоке
|
|||
|---|---|---|---|
|
#18+
wadmanО результате работы потока. База-то на форме? Ну, естессно. В стартовом посте написал. После коннекта и пары проверок все селекты в гридах отображаются корректно. Вот только на Дебе падает через раз. Откатиться, что ли, на предыдущие релизы Лазаря? Или попробовать UIB вместо IBX - ума не приложу... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.05.2017, 09:42 |
|
||
|
Lazarus: коннект в потоке
|
|||
|---|---|---|---|
|
#18+
ДокПосле коннекта и пары проверок все селекты в гридах отображаются корректно. Это же соединение потом в визуальной части используется? Если да, то как результат работы потока обрабатывается? Из стартового поста не видно как реально используется поток и база. ДокИли попробовать UIB вместо IBX - ума не приложу... Вряд-ли это поможет. ДокВот только на Дебе падает через раз. С какой ошибкой? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.05.2017, 09:48 |
|
||
|
Lazarus: коннект в потоке
|
|||
|---|---|---|---|
|
#18+
wadmanЭто же соединение потом в визуальной части используется? Если да, то как результат работы потока обрабатывается? В потоке поэтапно проходит сначала коннект к базе, затем проверки (грузятся настройки юзверя для отображения ), затем открывается табля с гридом на форме и поток завешается и умирает wadmanС какой ошибкой? доберусь до дома, покажу ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.05.2017, 10:45 |
|
||
|
Lazarus: коннект в потоке
|
|||
|---|---|---|---|
|
#18+
1. С одним коннектом может работать только один поток 2. Если несколько потоков создают коннекты, то эта процедура должна быть синхронизирована единым мьютексом 3. Пункт 2 распространяется на весь процесс. И если коннекты создаются в разных dll, то также должен использоваться единый мьютекс ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.05.2017, 11:39 |
|
||
|
Lazarus: коннект в потоке
|
|||
|---|---|---|---|
|
#18+
_Vasilisk_, wadman там код элементарный (на комменты не обращайте внимание, потом потру лишнее) сам коннект Код: 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. 56. 57. 58. 59. 60. 61. 62. 63. 64. 65. 66. 67. 68. 69. 70. 71. 72. 73. 74. 75. 76. 77. 78. 79. 80. 81. 82. 83. 84. 85. 86. 87. 88. 89. 90. 91. 92. 93. 94. 95. 96. 97. 98. 99. 100. 101. 102. 103. 104. 105. 106. 107. 108. 109. 110. 111. 112. 113. 114. 115. 116. 117. 118. 119. 120. 121. 122. 123. 124. 125. 126. 127. 128. 129. 130. 131. 132. 133. 134. 135. 136. 137. 138. 139. 140. 141. 142. 143. 144. 145. 146. 147. 148. 149. 150. 151. 152. 153. 154. 155. 156. 157. 158. 159. 160. 161. 162. 163. 164. 165. 166. 167. 168. 169. 170. 171. 172. 173. 174. 175. 176. 177. 178. 179. 180. 181. 182. 183. 184. 185. 186. 187. 188. 189. 190. 191. 192. 193. 194. 195. 196. 197. 198. 199. 200. 201. 202. 203. 204. 205. 206. 207. 208. 209. 210. 211. 212. 213. 214. 215. 216. 217. 218. создаю и запускаю поток Код: 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. В результате, на никсах, видно подтормаживание анимации, и через раз лезет окно с ошибкой (обычно в конце цикла коннекта) Код: pascal 1. 2. 3. В окне ассемблера Код: pascal 1. при попытке войти отладчиком в процедуру получаю Код: pascal 1. В файле проекта вроде все должно быть корректно Код: 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. ps. У меня ощущение, что приложению оперативки не хватает (Деб крутится на виртуалке с RAM 2048 kB). пробовал выделить ей 4 гига, картина та же ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.05.2017, 12:15 |
|
||
|
Lazarus: коннект в потоке
|
|||
|---|---|---|---|
|
#18+
ДокВ окне ассемблера Код: pascal 1. А выше что? Похоже, что перед выходом из некой процедуры стэк ломаный, возможно обращение к (уже) несуществующему объекту. Док Код: pascal 1. Тут нет обращения к визуальной части? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.05.2017, 12:49 |
|
||
|
Lazarus: коннект в потоке
|
|||
|---|---|---|---|
|
#18+
1. в отладке может что-то видно? 2. в основном потоке код работает? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.05.2017, 13:15 |
|
||
|
Lazarus: коннект в потоке
|
|||
|---|---|---|---|
|
#18+
makhaon, отладчик в Лазаре никакущий, в потоке вообще отладить что-либо сложно, если только пользовать DebugLn. Как назло, решил переставить новую ревизию (в предыдущей че-та с настройками случилось - не сохраняются). Теперь не компилится с ошибкой "...lazarus_trunk\ide\sourcefilemanager.pas(6459,27) Error: (5038) identifier idents no member "DesignPPI"". Ужос!!! зы. щас, разберусь со средой, отвечу :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.05.2017, 13:26 |
|
||
|
Lazarus: коннект в потоке
|
|||
|---|---|---|---|
|
#18+
wadmanТут нет обращения к визуальной части? Есть, и еще какое. примерно так Код: 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. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.05.2017, 14:02 |
|
||
|
Lazarus: коннект в потоке
|
|||
|---|---|---|---|
|
#18+
ДокЕсть, и еще какое. Дак нельзя так делать. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.05.2017, 14:16 |
|
||
|
Lazarus: коннект в потоке
|
|||
|---|---|---|---|
|
#18+
wadmanДак нельзя так делать. а если загрузка настроек из табли длительная, то как быть. В следующем потоке делать? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.05.2017, 15:31 |
|
||
|
Lazarus: коннект в потоке
|
|||
|---|---|---|---|
|
#18+
ДокwadmanДак нельзя так делать. а если загрузка настроек из табли длительная, то как быть. В следующем потоке делать? Суть не в этом, а в том, что сообщения (строками) для формы кидаешь-же сообщениями, что верно. Так и это (применение настроек) нужно делать подобным образом. Яж потому и спрашивал, как форма узнает, что поток отработал? Тут же получается, что поток работает с базой параллельно с формой... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.05.2017, 15:41 |
|
||
|
Lazarus: коннект в потоке
|
|||
|---|---|---|---|
|
#18+
Дока если загрузка настроек из табли длительная, то как быть.Загрузить в буфер, отдать буфер основному потоку и там применить ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.05.2017, 15:42 |
|
||
|
Lazarus: коннект в потоке
|
|||
|---|---|---|---|
|
#18+
_Vasilisk_Загрузить в буфер, отдать буфер основному потоку и там применить а как это технически выглядит, можно хотя бы схематично? wadmanТут же получается, что поток работает с базой параллельно с формой... хм.... а я и не подумал. Т.е., мне теперь в потоке каждый параметр вычитывать из табли и перегонять по одному сообщению в основную форму что ли? А нельзя их как-то массивом передать? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.05.2017, 15:51 |
|
||
|
Lazarus: коннект в потоке
|
|||
|---|---|---|---|
|
#18+
ДокА нельзя их как-то массивом передать? Хоть через TStringList (это один вариантов "буфера", что предложил _Vasilisk_). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.05.2017, 15:53 |
|
||
|
Lazarus: коннект в потоке
|
|||
|---|---|---|---|
|
#18+
закомментил Код: pascal 1. вроде валиться перестала. Щас буду думать, как параметры передавать: столбиком или в строчку :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.05.2017, 16:25 |
|
||
|
Lazarus: коннект в потоке
|
|||
|---|---|---|---|
|
#18+
wadman, кстати, а какова максимальная длина строки, которую можно через NewString передать? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.05.2017, 16:26 |
|
||
|
Lazarus: коннект в потоке
|
|||
|---|---|---|---|
|
#18+
Доккстати, а какова максимальная длина строки, которую можно через NewString передать? С моей стороны нет ограничений, все на уровне ОС/языка по свободной памяти и строкам. http://wiki.freepascal.org/Character_and_string_types#AnsiString тут и ниже. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.05.2017, 16:36 |
|
||
|
Lazarus: коннект в потоке
|
|||
|---|---|---|---|
|
#18+
Док, отладчик, конечно, не супер. но ограниченно поковырять можно, пробуй. авторВряд-ли, т.к. поток не компонент. Его не указать владельцем (чтоб он всех своих за собой "забрал"). можно компонентную обёртку всунуть вместо чистого потока. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.05.2017, 17:03 |
|
||
|
Lazarus: коннект в потоке
|
|||
|---|---|---|---|
|
#18+
_Vasilisk_2. Если несколько потоков создают коннекты, то эта процедура должна быть синхронизирована единым мьютексом 3. Пункт 2 распространяется на весь процесс. И если коннекты создаются в разных dll, то также должен использоваться единый мьютекс Если я не ошибаюсь, то такая особенность (необходимость синхронизации вызова isc_attach_database, т.е. TIBDatabase.Connected := True) была (что касается Firebird) до версии 3.0. А сейчас уже исправили (в fbclient.dll/so) это дело. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.05.2017, 17:10 |
|
||
|
Lazarus: коннект в потоке
|
|||
|---|---|---|---|
|
#18+
makhaonможно компонентную обёртку всунуть вместо чистого потока. Уже предлагал много раз. :( ладно хоть не на асме клепает. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.05.2017, 17:15 |
|
||
|
Lazarus: коннект в потоке
|
|||
|---|---|---|---|
|
#18+
YuRockбыла (что касается Firebird) до версии 3.0.Правильно. А в Interbase осталась. С чем работает Док и каких версий - неизвестно ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.05.2017, 17:32 |
|
||
|
Lazarus: коннект в потоке
|
|||
|---|---|---|---|
|
#18+
_Vasilisk_С чем работает Док и каких версий - неизвестно Загляни в его подпись 20500242 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.05.2017, 17:37 |
|
||
|
Lazarus: коннект в потоке
|
|||
|---|---|---|---|
|
#18+
wadmanУже предлагал много раз. :( ладно хоть не на асме клепает. нафиг, всегда проще понять и найти ошибку там, годе написал код сам :) _Vasilisk_1. С одним коннектом может работать только один поток 2. Если несколько потоков создают коннекты, то эта процедура должна быть синхронизирована единым мьютексом как-то был разговор про потокобезопасность FB, подробностей не вспомню. Поэтому хотел уточнить, в общих случаях: 1. если я в доп.потоке хочу что-то сделать с таблей (неважно, в основном потоке с ней что-то происходит или нет), мне нужно создать новый коннект? 2. если я хочу с одной и той же таблей сделать что-то (пусть пока будут селекты) из 2 и более параллельных коннектов, мне так же нужно будет создавать новый коннект на каждый поток, чтобы избежать использование мьютексов? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.05.2017, 18:32 |
|
||
|
Lazarus: коннект в потоке
|
|||
|---|---|---|---|
|
#18+
Док1. если я в доп.потоке хочу что-то сделать с таблей (неважно, в основном потоке с ней что-то происходит или нет), мне нужно создать новый коннект?Да Док2. если я хочу с одной и той же таблей сделать что-то (пусть пока будут селекты) из 2 и более параллельных коннектов , мне так же нужно будет создавать новый коннект на каждый поток , чтобы избежать использование мьютексов?Я не понял. У тебя два соединения. Какой еще новый коннект на поток? Два простых правила: 1) Каждый поток работает со своим коннектом. 2) До FB 3.0 создание нового коннекта должно было быть синхронизировано Первое правило можно иногда нарушать. Но когда именно - не знаю :)) Потому лучше не нарушать ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.05.2017, 18:53 |
|
||
|
Lazarus: коннект в потоке
|
|||
|---|---|---|---|
|
#18+
_Vasilisk_, Насколько я знаю, нельзя одновременно доступаться из разных потоков к коннекту и наборам. Последовательно - можно. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.05.2017, 19:00 |
|
||
|
Lazarus: коннект в потоке
|
|||
|---|---|---|---|
|
#18+
makhaon_Vasilisk_, Насколько я знаю, нельзя одновременно доступаться из разных потоков к коннекту и наборам. Последовательно - можно. В тройке вроде уже и одновременно можно*, но только это бессмысленно - там просто сработает внутренний объект синхронизации работы на коннекшен, если не ошибаюсь, т.ч. будет всё равно последовательно, в лучшем случае. *Имеется ввиду работа с ISC-API. Объекты же "компонентов" юзать одновременно в разных потоках нельзя в любом случае по другим причинам. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.05.2017, 19:19 |
|
||
|
Lazarus: коннект в потоке
|
|||
|---|---|---|---|
|
#18+
Док> Поэтому хотел уточнить, в общих случаях: C т.з. FB (2.5 и выше) можешь делать что хочешь (коннекты и вызовы), где хочешь (хоть в основном, хоть в доп.потоках) и как хочешь (в любом порядке). Думать нужно лишь о VCL-ной части - чтобы датасеты смогли поделить транзакции и коннекты. _Vasilisk_> Два простых правила: Ну уж тебе-то стыдно должно быть. :) _Vasilisk_> 2) До FB 3.0 До 2.5. В 3.0 на сей счёт ничего не менялось, вроде. Впрочем, могу и ошибаться. Posted via ActualForum NNTP Server 1.5 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.05.2017, 19:34 |
|
||
|
Lazarus: коннект в потоке
|
|||
|---|---|---|---|
|
#18+
_Vasilisk_Два простых правила: 1) Каждый поток работает со своим коннектом. 2) До FB 3.0 создание нового коннекта должно было быть синхронизировано Первое правило можно иногда нарушать. Но когда именно - не знаю :)) Потому лучше не нарушать Хм. Получается, я давненько по минному полю гуляю... Не, то есть про коннект на поток - это я знал и делал. А вот про синхронизацию че-та ни сном ни духом. Если не трудно, подскажи, как это делать? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.05.2017, 04:20 |
|
||
|
Lazarus: коннект в потоке
|
|||
|---|---|---|---|
|
#18+
_Викторович_Если не трудно, подскажи, как это делать? Сделай отдельный поток только для открытия коннектов. Например, через те же сообщения. Либо открывай в основном потоке, а для дальнейшей работы - отдавай в другой. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.05.2017, 08:40 |
|
||
|
Lazarus: коннект в потоке
|
|||
|---|---|---|---|
|
#18+
Гаджимурадов РустамДо 2.5. В 3.0 на сей счёт ничего не менялось, вроде. Впрочем, могу и ошибаться. http://www.ibase.ru/ibx/#onlogin чуть ниже описано про подключение в многопоточке. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.05.2017, 08:49 |
|
||
|
Lazarus: коннект в потоке
|
|||
|---|---|---|---|
|
#18+
_Викторович_А вот про синхронизацию че-та ни сном ни духом. Аналогично... Ни разу не было и менять не буду. :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.05.2017, 09:00 |
|
||
|
Lazarus: коннект в потоке
|
|||
|---|---|---|---|
|
#18+
wadmanчуть ниже описано про подключение в многопоточке получается, чисто коннект к базе лучше выносить в отдельный поток? Особенно, если таймаут коннекта занимает более 1 мин? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.05.2017, 09:05 |
|
||
|
Lazarus: коннект в потоке
|
|||
|---|---|---|---|
|
#18+
Докwadmanчуть ниже описано про подключение в многопоточке получается, чисто коннект к базе лучше выносить в отдельный поток? Особенно, если таймаут коннекта занимает более 1 мин? Насколько я понял, эта бага всплывает, когда в программе более одного коннекта, т.к. создание подключения не синхронизировано в нутрях клиента. У меня всегда один коннект был, не было подобных проблем ни разу. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.05.2017, 09:12 |
|
||
|
Lazarus: коннект в потоке
|
|||
|---|---|---|---|
|
#18+
Докwadmanчуть ниже описано про подключение в многопоточке получается, чисто коннект к базе лучше выносить в отдельный поток? Особенно, если таймаут коннекта занимает более 1 мин? Не знаю, зачем на ibase.ru придумали эту супер-идею с очередью в отдельном потоке для установления коннекшенов, я в таких случаях поступал так: Код: pascal 1. 2. 3. 4. 5. 6. пока это было актуально. А это действительно было актуально - я напарывался. Сейчас, к счастью, НАКОНЕЦ-ТО, я уже поубирал во многих местах эти ужасающие синхронизации на такой долгой операции, как коннект. Вообще, это был ужас. Просто нереальный. Заставлять коннектиться последовательно. Тебе не надо ничего такого, каз у тебя FB3. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.05.2017, 10:53 |
|
||
|
Lazarus: коннект в потоке
|
|||
|---|---|---|---|
|
#18+
YuRockТебе не надо ничего такого, каз у тебя FB3. Да, тут очень важно, чтобы у тебя и клиент был (fbclient/gds32) от FB3. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.05.2017, 10:55 |
|
||
|
Lazarus: коннект в потоке
|
|||
|---|---|---|---|
|
#18+
_Викторович_Хм. Получается, я давненько по минному полю гуляю... Не, то есть про коннект на поток - это я знал и делал. А вот про синхронизацию че-та ни сном ни духом. Везло. Мне тоже долго везло, а потом резко перестало. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.05.2017, 10:57 |
|
||
|
Lazarus: коннект в потоке
|
|||
|---|---|---|---|
|
#18+
wadman> http://www.ibase.ru/ibx/#onlogin wadman> чуть ниже описано про подключение в многопоточке. То ли я не увидел, то ли там ничего про версии FB и многопоток. Все проблемы, которые есть - это в датасетах/потоках запутаться или сделать "однопоточный многопоток". Posted via ActualForum NNTP Server 1.5 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.05.2017, 15:29 |
|
||
|
Lazarus: коннект в потоке
|
|||
|---|---|---|---|
|
#18+
Гаджимурадов РустамТо ли я не увидел, то ли там ничего про версии FB и многопоток. Нужной закладки на странице нет, потому ссылка на ближайшую. Про версии ничего нет, но текст там такой: ibase.ruИногда при подсоединении к БД в созданном thread может возникнуть ошибка на вызове isc_attach_database (собственно на функции, которая и осуществляет соединение к БД при вызове IBDatatase.Connected:=True). В этом случае вынесите открытие соединения в главный thread приложения, а дальнейшие операции с коннектом производите в пределах нужного thread. Судя по дате последнего изменения 09.2014 - речь о версиях до тройки. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.05.2017, 15:35 |
|
||
|
Lazarus: коннект в потоке
|
|||
|---|---|---|---|
|
#18+
У меня есть некоторые сомнения в достоверности этого текста. Лучше таки уточнить, и пусть Дима исправляет, актуализирует и уточняет, если что. Posted via ActualForum NNTP Server 1.5 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.05.2017, 16:45 |
|
||
|
Lazarus: коннект в потоке
|
|||
|---|---|---|---|
|
#18+
Гаджимурадов РустамЛучше таки уточнить, и пусть Дима исправляет, актуализирует и уточняет, если что. наверное, имеет смысл кому-то компетентному (а то ото всех только и слышишь: вроде бы, вроде бы ....) поднять тред, связанный с его сайтом тут, в дельфевой ветке. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.05.2017, 16:49 |
|
||
|
Lazarus: коннект в потоке
|
|||
|---|---|---|---|
|
#18+
Док> ото всех только и слышишь: вроде бы, вроде бы Дык это стандартная оговорка, даже от птицеводов - "не должно вроде бы". Начиная с 2.5 синхронизация делается на уровне порта (т.е. библиотеки), поэтому проблем "быть не должно вроде бы". А Дима, может, на что-то наткнулся, либо этот текст висит лет 10 не исправленный (версии и разница между IB/FB там вообще не упомянуты). > поднять тред, связанный с его сайтом тут, в дельфевой ветке. Не вижу большого смысла. В соседнем разделе где-то был, но в основном ему указывают об ошибках и пр. где попало (где речь зайдёт или где обнаружат). Posted via ActualForum NNTP Server 1.5 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.05.2017, 17:47 |
|
||
|
Lazarus: коннект в потоке
|
|||
|---|---|---|---|
|
#18+
Если получение данных с ФБ идет в одном потоке, а работа с этими данными и/или их визуализация - в другом, возникает следующий вопрос: Откуда взялась уверенность, что компоненты доступа к БД сделаны safe-thread и корректно реализуют "проход" данных сквозь барьер кэша ядра процессора? Надо заглянуть в исходники компонент доступа к БД и убедится в использовании ими команд процессора инвалидации кэшей для ядер процессора, кэширующих область памяти с полученными от ФБ данными. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.05.2017, 09:42 |
|
||
|
Lazarus: коннект в потоке
|
|||
|---|---|---|---|
|
#18+
rdb_devОткуда взялась уверенность Из всей ветки я сделал для себя вывод: хочешь что-то делать с данными в доп.потоке, создай в нем коннект - измени данные - убей коннект. Т.е., реализуй логику приложения так, как будто это доп.поток = новый юзер. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.05.2017, 11:59 |
|
||
|
Lazarus: коннект в потоке
|
|||
|---|---|---|---|
|
#18+
Док, с потоконебезопасными компонентами только так. Конечно, есть вариант с полной синхронизацией - инвалидацией всего кэша, но это пагубно сказывается на производительности. Не знаю как в Lazarus, но, к примеру, у компонента Borland/Embarcadero TThread есть метод Synchronize(). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.05.2017, 12:08 |
|
||
|
Lazarus: коннект в потоке
|
|||
|---|---|---|---|
|
#18+
rdb_devу компонента Borland/Embarcadero TThread есть метод Synchronize(). , который вообщеиспользовать нельзя категорически, т.к. он как минимум: 1) замораживает очередь сообщений vcl-потока до обработки всех методов, вызванных в Synchronize во всех потоках; 2) Может приводит к существенной (неизвестно, какой, возможно и бесконечной - зависит от обработчика сообщения, находящегося в очереди) задержке перед вызовом метода, но это ладно; 3) может вообще не вызваться, что приведет ко многим интересным последствиям, любое из которых - полный крах всей логики приложения. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.05.2017, 12:45 |
|
||
|
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 |
|
||
|
Lazarus: коннект в потоке
|
|||
|---|---|---|---|
|
#18+
Коннекта и одного хватит для фоновых задач. У тебя алгоритм сейчас какой? Я-бы фоном фетчил по 200 записей и возвращал их основному потоку, а в нем-бы заливал в мемори датасет. Переброска в памяти дело шустрое, едва заметное. А при пустом результате просто выставлял-бы флаг, что данных больше нет. Хотя... Если база многопользовательская, то данные могут и появиться. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.02.2018, 08:56 |
|
||
|
Lazarus: коннект в потоке
|
|||
|---|---|---|---|
|
#18+
wadmanЯ-бы фоном фетчил по 200 записей и возвращал их основному потоку, а в нем-бы заливал в мемори датасет. Я в ходе эспериментов тоже пришел к выводу, что создавать коннект и фетчить записи нужно в доп.потоке, а данные заливать в память. Смущает, что при каждом фетче создается-уничтожается коннект: тру-программисты так делают или нет? :) Основной затык у меня пока в динамическом увеличении/уменьшении SKIP(n) в условной конструкции 'SELECT FIRST 200 SKIP(n) ...' при достижении начала (BOF) или конца(EOF) резалтсета (чтобы увеличить/уменьшить SKIP на FIRST-ное количество записей). Вернее, где проводить эту проверку. В идеале повесить бы эту проверку в OnDataChange датасорса, но там происходит зацикливание, как только динамически подключаешь его к датасету Код: pascal 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. Потому и вопрошал, кто где и как делает. зы. Кстати, тут интересная дискуссия развернулась по отрисовке LCL-элементов во время работы потоков. Также кем-то была высказана мысль, что для передачи строк в основной поток недопустимо использовать PostMessage, т.к. указатели на них могут "уже потеряться", пока до них доберется основной поток. Принципиальных возражений вроде нет, но ... я заметил, что Линукс элементарно "висит" пока не заменишь SendMessage на PostMessage ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.02.2018, 09:41 |
|
||
|
Lazarus: коннект в потоке
|
|||
|---|---|---|---|
|
#18+
ДокВернее, где проводить эту проверку. Чем AfterScroll не подошёл? Я вообще-бы не делал серфинг вперед-назад, а сделал-бы просто подгрузку в одном направлении -> вперед. Докзы. Кстати, тут интересная дискуссия развернулась по отрисовке LCL-элементов во время работы потоков. Также кем-то была высказана мысль, что для передачи строк в основной поток недопустимо использовать PostMessage, т.к. указатели на них могут "уже потеряться", пока до них доберется основной поток. Принципиальных возражений вроде нет, но ... я заметил, что Линукс элементарно "висит" пока не заменишь SendMessage на PostMessage Я давно прошел эти этапы. :) Все через сообщения (в т.ч. и строки через выделенную память) и никаких проблем. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.02.2018, 10:10 |
|
||
|
Lazarus: коннект в потоке
|
|||
|---|---|---|---|
|
#18+
wadmanЯ вообще-бы не делал серфинг вперед-назад, а сделал-бы просто подгрузку в одном направлении -> вперед. хм, а это мне в голову как-то сразу не пришло :) А датасет в памяти сможет 400К записей и больше удержать? wadmanВсе через сообщения (в т.ч. и строки через выделенную память) и никаких проблем. вот в этом-то вся и беда, надо выделять/освобождать память для передаваемых объектов - геморройно :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.02.2018, 11:42 |
|
||
|
Lazarus: коннект в потоке
|
|||
|---|---|---|---|
|
#18+
ДокА датасет в памяти сможет 400К записей и больше удержать? Сначала спроси у человека, сможет ли он хотя-бы тысячу записей удержать в голове. Не сталкивался с такими потребностями... Тут только тестировать, размер строки бывает разным. Докнадо выделять/освобождать память для передаваемых объектов - геморройно :) Ты же это не сам будешь делать, а напишешь для этого код, который работает за тебя. :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.02.2018, 11:49 |
|
||
|
Lazarus: коннект в потоке
|
|||
|---|---|---|---|
|
#18+
Докдля передачи строк в основной поток недопустимо использовать PostMessage,Допустимо, но с умом Код: pascal 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.02.2018, 11:51 |
|
||
|
Lazarus: коннект в потоке
|
|||
|---|---|---|---|
|
#18+
ДокА датасет в памяти сможет 400К записей и больше удержать?Однонаправленный сможет ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.02.2018, 11:52 |
|
||
|
Lazarus: коннект в потоке
|
|||
|---|---|---|---|
|
#18+
_Vasilisk_Докдля передачи строк в основной поток недопустимо использовать PostMessage,Допустимо, но с умом Код: pascal 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. Классный вариант! Правда, хак. Я у себя делал через NewStr/DisposeStr. Кстати, надо еще помнить, что PostMessage может вернуть False и не отправить сообщение. То бишь в данном варианте Код: pascal 1. 2. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.02.2018, 14:28 |
|
||
|
Lazarus: коннект в потоке
|
|||
|---|---|---|---|
|
#18+
Василий №2Правда, хак.Не хак. Просто понимание работы счетчика ссылок Василий №2Я у себя делал через NewStr/DisposeStr.Это лучше. Василий №2PostMessage может вернуть False и не отправить сообщение.Хорошее уточнение Главный недостаток обоих способов, что для Send тоже нужно дополнительно выделять память ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.02.2018, 14:44 |
|
||
|
Lazarus: коннект в потоке
|
|||
|---|---|---|---|
|
#18+
_Vasilisk_Это лучше. обязательным копированием содержимого строки? лучше просто очередь завести и в нее сбрасывать ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.02.2018, 15:11 |
|
||
|
Lazarus: коннект в потоке
|
|||
|---|---|---|---|
|
#18+
Ariochобязательным копированием содержимого строки?Читабельнее ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.02.2018, 15:41 |
|
||
|
Lazarus: коннект в потоке
|
|||
|---|---|---|---|
|
#18+
_Vasilisk_, TThreadQueue.Enqueue еще читабельнее ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.02.2018, 17:20 |
|
||
|
Lazarus: коннект в потоке
|
|||
|---|---|---|---|
|
#18+
Василий №2Кстати, надо еще помнить, что PostMessage может вернуть False и не отправить сообщение. То бишь в данном варианте Код: pascal 1. 2. Пофиг. Я PostMessage использую только в некритичных случаях (в гуи инфу отослать для отображения) и то, только под линукс (он, собака, просто перестает рисовать окна, если завалить его потоком SendMessage). Для остальных случаях - только SendMessage ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.02.2018, 20:06 |
|
||
|
Lazarus: коннект в потоке
|
|||
|---|---|---|---|
|
#18+
ДокПофиг. Я PostMessage использую только в некритичных случаяхНе пофиг. Будет утечка памяти если не проверить результат и тупо обнулить ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.02.2018, 20:34 |
|
||
|
Lazarus: коннект в потоке
|
|||
|---|---|---|---|
|
#18+
_Vasilisk_, ок, возьму на заметку. Спасибо за пояснения ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.02.2018, 22:33 |
|
||
|
Lazarus: коннект в потоке
|
|||
|---|---|---|---|
|
#18+
_Vasilisk_Не хак. Просто понимание работы счетчика ссылок Не... таки хак. Ибо вмешательство во внутренний механизм. _Vasilisk_Главный недостаток обоих способов, что для Send тоже нужно дополнительно выделять память Хм. Занафига? Ведь пока Send не отработает, он не вернет управление, а значит, и строка не уничтожится ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.02.2018, 10:18 |
|
||
|
Lazarus: коннект в потоке
|
|||
|---|---|---|---|
|
#18+
_Vasilisk_Не пофиг. Будет утечка памяти если не проверить результат и тупо обнулить Это ее не устранит. Хотя вероятность понизит. Но устранит только гарантия "сообщение получено, за освобождение памяти теперь отвечает другой блок программы" А "если проверить результат" - то ты просто передал какое-то сообщение Windows, не свеой программЕ, а операционке. А оно было доставлено до нужного места программы? Может окошко раньше получило WM_CLOSE и закрылось ? Или даже не окно, а весь поток повис и был отстрелен? Или ReCreateWND случился и хэндл поменялся? Или это просто было не то окно, перепутали хэндл, и оно в принципе такие мэссиджи не умеет обрабатывать ? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.02.2018, 14:07 |
|
||
|
Lazarus: коннект в потоке
|
|||
|---|---|---|---|
|
#18+
ДокДля остальных случаях - только SendMessage Если всё это в рамках одной программы - то SendMessage хорош только для однородности с PostMessage, чтобы одно в другое превращать заменой 4-х символов. А в рамках VCL (и наверное LCL) вместo SendMessage есть TWinControl.Perform ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.02.2018, 14:09 |
|
||
|
Lazarus: коннект в потоке
|
|||
|---|---|---|---|
|
#18+
Arioch, я бы уж тогда лучше предпочел Queue(безопасный аналог PostMessage) и Synchronize(соответственно аналог SendMessage). Как пишут в ваших интернетах, они абсолютно ThreadSafe, но не знаю, настолько ли гибки, как Send/PostMessage. Мне они по некоторым причинам не понравились. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.02.2018, 14:29 |
|
||
|
Lazarus: коннект в потоке
|
|||
|---|---|---|---|
|
#18+
Василий №2Хм. Занафига? Ведь пока Send не отработает, он не вернет управление, а значит, и строка не уничтожится не только строка, но и любой указатель, если я правильно ошибаюсь ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.02.2018, 14:30 |
|
||
|
Lazarus: коннект в потоке
|
|||
|---|---|---|---|
|
#18+
Докя бы уж тогда лучше предпочел Queue Судя по Synchronize ты имеешь в виду TThread.Queue зачем создавaть сложный объект типа "анонимная функция", если передать нужно всего лишь одну строку? лишние накладные расходы и лишняя возможность ошибиться. нет, если мы передаём сложное и разнообразное поведение, тогда конечно но если передать только данные надо - то и передавать надо только данные 21208990 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.02.2018, 15:35 |
|
||
|
Lazarus: коннект в потоке
|
|||
|---|---|---|---|
|
#18+
Ariochзачем создавaть сложный объект типа "анонимная функция", если передать нужно всего лишь одну строку? лишние накладные расходы и лишняя возможность ошибиться. редко приходится передавать просто строку. Обычно 2-3 параметра. Плохо то, что Queue/Synchronize вызываются вообще без параметров, поэтому приходится городить отдельную процедуру на каждый чих. Send/PostMessage намного гибче. Ariochно если передать только данные надо - то и передавать надо только данные 21208990 Кстати, а что ты имеешь ввиду под словом TThreadQueue.Enqueue? Мой гугл про это не знает. В сорцах fpc я этого тоже не нашел. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.02.2018, 16:02 |
|
||
|
Lazarus: коннект в потоке
|
|||
|---|---|---|---|
|
#18+
AriochА оно было доставлено до нужного места программы? Может окошко раньше получило WM_CLOSE и закрылось ? Или даже не окно, а весь поток повис и был отстрелен? Или ReCreateWND случился и хэндл поменялся? Или это просто было не то окно, перепутали хэндл, и оно в принципе такие мэссиджи не умеет обрабатывать ? Основная часть этих событий - нештатные, где уже по барабану утечки памяти. Вот с закрытием да. В случае потока у меня везде стоят вычерпывалки сообщений из очереди с освобождением памяти. В случае окон вычерпывалка довольно нетривиальна. AriochА в рамках VCL (и наверное LCL) вместo SendMessage есть TWinControl.Perform Особо без разницы. Разве что безопаснее с точки зрения изменения хэндла, но для VCL объектов в любом случае лучше сохранять объект, а не хэндл Докне только строка, но и любой указатель, если я правильно ошибаюсь "любой указатель" сам не уничтожается, в отличие от managed типов ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.02.2018, 16:07 |
|
||
|
Lazarus: коннект в потоке
|
|||
|---|---|---|---|
|
#18+
ДокОбычно 2-3 параметра. record или class ДокКстати, а что ты имеешь ввиду под словом TThreadQueue.Enqueue? Мой гугл про это не знает. Ну да, в отличие от TThreadList готового в Delphi нет, а потому и в FPC едва ли появится но в общем 1) можно легко написать на базе TQueue<T> - просто все методы доступа (положить в очередь, достать из очереди, проверить есть ли что-то в очереди и т.д.) обернуть через TMonitor или TCriticalSection Если не очень мощный поток данных - то хватит вполне. В общем ,смотришь как на основе TList<T> сделан TThreadList<T> и делаешь буквально то же с TQueue<T> А записи разной структуры оборачиваются внутрь TValue (стандартного, либо какого-то стороннего, оптимизированного по скорости). Если вообще в одной очереди надо записи разных типов класть. Но это будет копирование данных. Лучше указатель на record передавать, либо объект (он сам себе указатель). Кстати, кажется mORMot до появления в D2009 Advanced Record таки пользвоался старыми turboPascal-style объектами, потму что они намного быстрее создаются/убиваются, чем дельфийские классы. Как раз для передачи данных 2) в интернете полно статей на тему, недавно вышла одна, но там была очередь типа named pipes - в ней строго один писатель и строго один читатель, зато безблокировочная. Но опять же для delphi, насколько сложно ее перетащить будет в fpc/linux хз. Если можно, и читатель один (на примере другой ветки - в службе Windows 10 потоков перебирают окна и отсылают их названия в один поток, который пишет в БД), то никто не мешает для каждого потока генерящего данные завести отдельную очередь, а принимающий поток будет их по кругу осматривать. 3) кажется недавно кто-то переносил OmniThreadLibrary на FPC/Linux, но я сам не смотрел. Там очередь (iOmniBlockingColleciton) должна быть без блокировок. В принципе, если там на 90% сделано вдруг, то включиться в процесс "добить последние баги" можешь и ты. Опять же в том же mORMot'e есть свой форк менеджера памяти SynScaleMM - там у каждого потока эксклюзивная lockless очередь блоков памяти на освобождение, куда другие потокаи скидывают "не свои" указатели из MemFree. Верятно ее можно за основу взять, если наивнйо блокировки (см. п. 1) не хватит. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.02.2018, 16:20 |
|
||
|
Lazarus: коннект в потоке
|
|||
|---|---|---|---|
|
#18+
ДокSend/PostMessage намного гибче.Ээээ?... Цельно катаная апишная будет гибче анонимной?! Может ты её готовить просто не умеешь? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.02.2018, 16:28 |
|
||
|
Lazarus: коннект в потоке
|
|||
|---|---|---|---|
|
#18+
Василий №2_Vasilisk_Главный недостаток обоих способов, что для Send тоже нужно дополнительно выделять память Хм. Занафига? Ведь пока Send не отработает, он не вернет управление, а значит, и строка не уничтожитсяПотому, что строка уничтожится в обработчике. Для Вашего способа это означает, что для Send нужно все-таки вызвать NewStr, для моего - произвести манипуляцию с обнулением ссылки ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.02.2018, 18:16 |
|
||
|
Lazarus: коннект в потоке
|
|||
|---|---|---|---|
|
#18+
_Vasilisk_Потому, что строка уничтожится в обработчике. Для Вашего способа это означает, что для Send нужно все-таки вызвать NewStr, для моего - произвести манипуляцию с обнулением ссылки Хм. Если обработчик рассчитан на Send, то ничего ему уничтожать не надо. А вот если он и на Send, и на Post - тогда да. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.02.2018, 18:28 |
|
||
|
Lazarus: коннект в потоке
|
|||
|---|---|---|---|
|
#18+
Ariochможно легко написать на базе TQueue<T> - просто все методы доступа (положить в очередь, достать из очереди, проверить есть ли что-то в очереди и т.д.) обернуть через TMonitor или TCriticalSection Не, я все-таки стараюсь придерживаться принципов бритвы Оккама. Для передачи одной строчки, числа или указателя на структуру городить целый раппер - по-моему, чересчур white_niggerЦельно катаная апишная будет гибче анонимной?! Я попытался в Queue публичной переменной сплэш-формы напрямую присвоить текст и получил в сеттере отлуп. Наверное не умею. Разбирательство отложил на потом ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.02.2018, 18:54 |
|
||
|
Lazarus: коннект в потоке
|
|||
|---|---|---|---|
|
#18+
Василий №2А вот если он и на Send, и на PostЯ это и имел ввиду ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.02.2018, 19:10 |
|
||
|
Lazarus: коннект в потоке
|
|||
|---|---|---|---|
|
#18+
ДокЯ попытался в Queue публичной переменной сплэш-формы напрямую присвоить текст и получил в сеттере отлуп. Наверное не умею. Разбирательство отложил на потомНе силён в лазаре. Но если сделаешь пример на делфе - могу глянуть что пошло не так. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.02.2018, 20:06 |
|
||
|
Lazarus: коннект в потоке
|
|||
|---|---|---|---|
|
#18+
white_niggerНе силён в лазаре. Но если сделаешь пример на делфе - могу глянуть что пошло не так. на D7 лазаревый код не взлетел, старшие версии лень ставить. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.02.2018, 22:54 |
|
||
|
Lazarus: коннект в потоке
|
|||
|---|---|---|---|
|
#18+
Мужики, посоветуйте еще. Где лучше создавать/разрушать компоненты доступа (TIBDatabase, TTransactions и проч.): в конструкторе/деструкторе потока или в execute потока? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.02.2018, 23:17 |
|
||
|
Lazarus: коннект в потоке
|
|||
|---|---|---|---|
|
#18+
Док, Конечно же в Execute, ведь конструктор - это другой, "создающий" поток. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.02.2018, 23:40 |
|
||
|
Lazarus: коннект в потоке
|
|||
|---|---|---|---|
|
#18+
Док, без разницы где коннект создаётся. никогда проблем не было. лишь бы к нему во время работы не лезли из разных потоков. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.02.2018, 00:23 |
|
||
|
Lazarus: коннект в потоке
|
|||
|---|---|---|---|
|
#18+
makhaonДок, без разницы где коннект создаётся. никогда проблем не было. лишь бы к нему во время работы не лезли из разных потоков.Коннект - долгая операция. Смысл тогда делать запрос из бд в другом потоке, если коннект, который может быть даже дольше, чем выполнение запроса, будет в основном. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.02.2018, 03:04 |
|
||
|
Lazarus: коннект в потоке
|
|||
|---|---|---|---|
|
#18+
YuRockmakhaonДок, без разницы где коннект создаётся. никогда проблем не было. лишь бы к нему во время работы не лезли из разных потоков.Коннект - долгая операция. Смысл тогда делать запрос из бд в другом потоке, если коннект, который может быть даже дольше, чем выполнение запроса, будет в основном. Расскажешь, как шарить контекст коннекта к БД FireBird между потоками? Или ты снова как Мюллер, который помнит лишь как к нему Штирлиц за скрепками заходил? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.02.2018, 03:30 |
|
||
|
Lazarus: коннект в потоке
|
|||
|---|---|---|---|
|
#18+
YuRockКоннект - долгая операция. Смысл тогда делать запрос из бд в другом потоке, если коннект, который может быть даже дольше, чем выполнение запроса, будет в основном. Я немного о другом. Я про создание экземпляра коннекта (типа, FDataBase:= TIBDatabase.Create(Application)) и инициализацию параметров (DatabaseName,LibraryName и т.д.). Хочется "разгрузить" код в Execute. Единственное сомнение, создание экземпляра объекта обычно заворачивается в try..finally, а тут в случае ошибки создания finally выполнится только в деструкторе потока. Потому и спросил. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.02.2018, 09:06 |
|
||
|
Lazarus: коннект в потоке
|
|||
|---|---|---|---|
|
#18+
ДокYuRockКоннект - долгая операция. Смысл тогда делать запрос из бд в другом потоке, если коннект, который может быть даже дольше, чем выполнение запроса, будет в основном. Я немного о другом. Я про создание экземпляра коннекта (типа, FDataBase:= TIBDatabase.Create(Application)) и инициализацию параметров (DatabaseName,LibraryName и т.д.). Хочется "разгрузить" код в Execute. Единственное сомнение, создание экземпляра объекта обычно заворачивается в try..finally, а тут в случае ошибки создания finally выполнится только в деструкторе потока. Потому и спросил. Без разницы, делай как удобнее. Коннект это не окно, которое автоматом "пристраивается" к создавшему его потоку. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.02.2018, 11:09 |
|
||
|
Lazarus: коннект в потоке
|
|||
|---|---|---|---|
|
#18+
чччДРасскажешь, как шарить контекст коннекта к БД FireBird между потоками?А зачем это? ТСу надо не это, ему надо изолированный в потоке коннект. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.02.2018, 11:32 |
|
||
|
Lazarus: коннект в потоке
|
|||
|---|---|---|---|
|
#18+
ДокХочется "разгрузить" код в Execute.Это делается по-другому, а не такими извращениями. В Execute делается создание объектов (и удаление в finally, как ты хочешь), а между try и finally вызывается одна единственная функция - DoWork (или как хочешь назови этот статический метод). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.02.2018, 11:36 |
|
||
|
Lazarus: коннект в потоке
|
|||
|---|---|---|---|
|
#18+
YuRock, Как правило, всё таки сам запрос длиннее коннекта. Не знаю, может разве что в интернете как-то по-другому. В локалке коннект занимает сотни миллисекунд, насколько я видел. И редко какой запрос идёт быстрее, мне кажется. авторРасскажешь, как шарить контекст коннекта к БД FireBird между потоками? Ссылки, они же указатели, в помощь. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.02.2018, 12:38 |
|
||
|
Lazarus: коннект в потоке
|
|||
|---|---|---|---|
|
#18+
YuRock, а что мешает открыть коннект и не закрывать его? если он нужен постоянно. либо сделать пулл коннектов. у меня многопоточный пулл коннектов + ibquery занимает может строк 50 кода (раздаёт ibquery). правда, read only только. но мне как раз такой пулл нужен был. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.02.2018, 12:42 |
|
||
|
Lazarus: коннект в потоке
|
|||
|---|---|---|---|
|
#18+
makhaon, Сотни миллисекунд - все же сотни миллисекунд. Зачем основному потоку их тормозить (когда доп. поток создается для "работы с базой в доп. потоке"), остается непонятным. И, да. В том же Firebird, если это 1-й коннект к базе (или не первый, но последний был "давно"), а база на десятки, сотни и т.д. гиг, то это будут совсем не сотни миллисекунд. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.02.2018, 13:06 |
|
||
|
Lazarus: коннект в потоке
|
|||
|---|---|---|---|
|
#18+
makhaonYuRock, а что мешает открыть коннект и не закрывать его? если он нужен постоянно. либо сделать пулл коннектов. у меня многопоточный пулл коннектов + ibquery занимает может строк 50 кода (раздаёт ibquery). правда, read only только. но мне как раз такой пулл нужен был.Все это прекрасно. Не понятно только до сих пор, зачем для этого забирать у запускающего потока "сотни миллисекунд". И, да, если у тебя пул - ты что, все его коннекты в конструкторе создаешь, что-ли? Сомневаюсь :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.02.2018, 13:09 |
|
||
|
Lazarus: коннект в потоке
|
|||
|---|---|---|---|
|
#18+
YuRockЭто делается по-другому, а не такими извращениями. В Execute делается создание объектов (и удаление в finally, как ты хочешь), а между try и finally вызывается одна единственная функция - DoWork (или как хочешь назови этот статический метод). Чувствую, что идеологически верно именно так, но уж больно велик соблазн создавать объекты на автомате в конструкторе потока, не заботясь об их судьбе (и не создавать новые поля объекта для сохранения переданных в Create параметров). Потому и спросил, как делают ТруЪ-программисты :) зы. ты чего такой нервный с утра? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.02.2018, 13:09 |
|
||
|
Lazarus: коннект в потоке
|
|||
|---|---|---|---|
|
#18+
makhaonа что мешает открыть коннект и не закрывать его? В принципе, ничего. Но я хочу попробовать реализовать логику на мемори-датасетах. Дернул сервер, отфетчил записи на клиента - сиди, работай. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.02.2018, 13:25 |
|
||
|
Lazarus: коннект в потоке
|
|||
|---|---|---|---|
|
#18+
YuRock, создаются по мере надобности. запросили, есть свободный коннект - выделился. нет - создался. как только не нужен - 'вернулся' назад в пулл. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.02.2018, 13:29 |
|
||
|
Lazarus: коннект в потоке
|
|||
|---|---|---|---|
|
#18+
makhaonYuRock, создаются по мере надобности. запросили, есть свободный коннект - выделился. нет - создался. как только не нужен - 'вернулся' назад в пулл. Ну вот. Не в конструкторе же. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.02.2018, 14:22 |
|
||
|
Lazarus: коннект в потоке
|
|||
|---|---|---|---|
|
#18+
ДокЧувствую, что идеологически верно именно так Можно еще сделать класс TIBSingleConnectionThread, в котором будут 1. Созданы и в конструкторе сохранены "новые поля объекта для сохранения переданных в Create параметров" 2. В уже перекрытом Execute будет создаваться, стартовать и удаляться соединение в try finally, а так же после try будет вызываться абстрактный метод DoWork. Докзы. ты чего такой нервный с утра? Зуб заболел. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.02.2018, 14:27 |
|
||
|
|

start [/forum/topic.php?all=1&fid=58&tid=2041189]: |
0ms |
get settings: |
9ms |
get forum list: |
19ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
161ms |
get topic data: |
10ms |
get forum data: |
2ms |
get page messages: |
153ms |
get tp. blocked users: |
1ms |
| others: | 295ms |
| total: | 656ms |

| 0 / 0 |
