|
|
|
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 |
|
||
|
|

start [/forum/topic.php?fid=58&msg=39457135&tid=2041189]: |
0ms |
get settings: |
5ms |
get forum list: |
18ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
32ms |
get topic data: |
10ms |
get forum data: |
3ms |
get page messages: |
67ms |
get tp. blocked users: |
1ms |
| others: | 203ms |
| total: | 345ms |

| 0 / 0 |
