|
|
|
Lazarus: передача blob, как параметра, внутрь и наружу TThread
|
|||
|---|---|---|---|
|
#18+
Решил полностью перенести логику чтения/записи из/в БД в доп.потоки. С передачей обычных типов проблем нет Код: pascal 1. Как запихать сабж в параметр и/или передать его в основной поток? ================= Док. Win7 Ultim x64/Deb 8.7 i386: FB 3.0.2.32703, диалект 3, SS(win)/SC(Deb), Lazarus 1.9(r.55538); FPC 3.1.1 (r.36290), IBX by -Rik-; IBE 2017.4.19.2 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.08.2017, 10:56:41 |
|
||
|
Lazarus: передача blob, как параметра, внутрь и наружу TThread
|
|||
|---|---|---|---|
|
#18+
Как поток... Который TMemoryStream то есть. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.08.2017, 11:00:45 |
|
||
|
Lazarus: передача blob, как параметра, внутрь и наружу TThread
|
|||
|---|---|---|---|
|
#18+
wadmanКак поток... Который TMemoryStream то есть. вот гад Ты пальцем покажи, не догоняю .. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.08.2017, 11:02:02 |
|
||
|
Lazarus: передача blob, как параметра, внутрь и наружу TThread
|
|||
|---|---|---|---|
|
#18+
Док, поток - стрим, нить - тред. Такие дела. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.08.2017, 11:32:24 |
|
||
|
Lazarus: передача blob, как параметра, внутрь и наружу TThread
|
|||
|---|---|---|---|
|
#18+
ДокКак запихать сабж в параметр В старом дельфевом (когда было String=AnsiString) IBX работало ParamByName( 'BLOBFIELD' ).AsString := SBlobData, где SBlobData - любые (можно и бинарные) данные блоб. Может сработать ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.08.2017, 12:07:36 |
|
||
|
Lazarus: передача blob, как параметра, внутрь и наружу TThread
|
|||
|---|---|---|---|
|
#18+
чччД, т.е. затроллить решили? Ладно-ладно ... YuRockМожет сработать а если там бинарных данных на десяток мегабайт? Я смогу впихнуть невпихуемое в параметр? зы. я-то надеялся, можно указатель какой передать или где. А так придется на буржуйский форум идти :( ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.08.2017, 12:29:42 |
|
||
|
Lazarus: передача blob, как параметра, внутрь и наружу TThread
|
|||
|---|---|---|---|
|
#18+
Док, Блоб-поля можно вводить и выводить через TStream, Например TMemoryStream. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.08.2017, 12:32:30 |
|
||
|
Lazarus: передача blob, как параметра, внутрь и наружу TThread
|
|||
|---|---|---|---|
|
#18+
DesWind, ты хоть словами скажи (хотя бы схематично), что-как-где создать сначала, куды запихнуть потом. При этом так, чтобы анимашка крутилась и сообщения юзверю показывала. Я реально че-та затупил... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.08.2017, 12:35:45 |
|
||
|
Lazarus: передача blob, как параметра, внутрь и наружу TThread
|
|||
|---|---|---|---|
|
#18+
ДокYuRockМожет сработать а если там бинарных данных на десяток мегабайт? Я смогу впихнуть невпихуемое в параметр? зы. я-то надеялся, можно указатель какой передать или где. А так придется на буржуйский форум идти :( десяток мегабайт - это не так уж и много. Вот если на гигабайты счет - тогда плохо. Для этого уже только TBlobField.LoadFromStream. Но, блин, что за база такая ( на FB ), в которую гигабайтами блобы льют - страшно представить) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.08.2017, 13:12:03 |
|
||
|
Lazarus: передача blob, как параметра, внутрь и наружу TThread
|
|||
|---|---|---|---|
|
#18+
ДокЯ смогу впихнуть невпихуемое в параметр? Зависит от того, сработает ли на твоём IBX такое. У меня работает. На моём отлично работает так: Код: pascal 1. 2. где SBlobData - неюникодный стринг, FInsertCommand - один раз препарированный TIBSQL с инсертом и параметром. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.08.2017, 13:15:44 |
|
||
|
Lazarus: передача blob, как параметра, внутрь и наружу TThread
|
|||
|---|---|---|---|
|
#18+
Не вижу проблемы вытащить из базы: Код: pascal 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. Поместить в базу еще проще: Код: pascal 1. далее стандартные операции TDataSet ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.08.2017, 13:36:36 |
|
||
|
Lazarus: передача blob, как параметра, внутрь и наружу TThread
|
|||
|---|---|---|---|
|
#18+
ага, спасибо. Ушел думать ... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.08.2017, 13:44:47 |
|
||
|
Lazarus: передача blob, как параметра, внутрь и наружу TThread
|
|||
|---|---|---|---|
|
#18+
В UIB у полей есть такие свойства как AsStream и AsBytes - но не уверен, что он соберется на Лазаре. В любом случае - если речь идет о бооольших блобах, то задержка может быть и на дисковой операции, и на сетевой (БД) Т.е. там нужно в отдельной нити (thread) сделать отдельное соединение с БД, и уже в этом отдельном соединении грузить блоб. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.08.2017, 14:39:22 |
|
||
|
Lazarus: передача blob, как параметра, внутрь и наружу TThread
|
|||
|---|---|---|---|
|
#18+
schiПоместить в базу еще проще: Код: pascal 1. Да, но в таком варианте много неявных и явных "лишних" операций: - открыть запрос - сделать Append - заполнить поля - сделать Post - перед всем этим оформить InsertSQL правильно... В случае препарированного инсерта ничего этого делать не надо. задал параметр - и Exec, всё. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.08.2017, 14:57:24 |
|
||
|
Lazarus: передача blob, как параметра, внутрь и наружу TThread
|
|||
|---|---|---|---|
|
#18+
1. Каждый коннект должен быть в своем Thread, и это правильно. 2. Вроде у TField должны быть методы LoadFromStream и SaveToStream. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.08.2017, 15:14:37 |
|
||
|
Lazarus: передача blob, как параметра, внутрь и наружу TThread
|
|||
|---|---|---|---|
|
#18+
Чтение Код: pascal 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. Запись Код: pascal 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. Соответственно TIBBlobStream создаешь в потоке, а обмениваешься BlobID (AsQuad). Как это все будет работать в многопотоке - хз. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.08.2017, 15:24:06 |
|
||
|
Lazarus: передача blob, как параметра, внутрь и наружу TThread
|
|||
|---|---|---|---|
|
#18+
Для датасетов такой способ Код: pascal 1. И потом этот стрим отдаешь в поток. Дисклаймер тот же_Vasilisk_Как это все будет работать в многопотоке - хз. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.08.2017, 15:32:30 |
|
||
|
Lazarus: передача blob, как параметра, внутрь и наружу TThread
|
|||
|---|---|---|---|
|
#18+
_Vasilisk_Для датасетов такой способТолько не забудь потом вызвать Код: pascal 1. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.08.2017, 15:33:20 |
|
||
|
Lazarus: передача blob, как параметра, внутрь и наружу TThread
|
|||
|---|---|---|---|
|
#18+
YuRockschiПоместить в базу еще проще: Код: pascal 1. Да, но в таком варианте много неявных и явных "лишних" операций: - открыть запрос - сделать Append - заполнить поля - сделать Post - перед всем этим оформить InsertSQL правильно... В случае препарированного инсерта ничего этого делать не надо. задал параметр - и Exec, всё. Виноват, DataSet, которым я пользуюсь, понимает, что запись в поле это задание параметров для запроса вставки/обновления. Аналог TUpdateSQL. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.08.2017, 15:41:28 |
|
||
|
Lazarus: передача blob, как параметра, внутрь и наружу TThread
|
|||
|---|---|---|---|
|
#18+
_Vasilisk_, за IBBlobStream спасибо, не знал. Надо будет посмотреть в том форке, который у меня в Лазаре стоит. Проблемы в доп.потоке создать/уничтожить компоненты доступа и коннект нет. Есть проблема обмена блобами между потоками. Пошел шарить по исходникам. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.08.2017, 18:37:53 |
|
||
|
Lazarus: передача blob, как параметра, внутрь и наружу TThread
|
|||
|---|---|---|---|
|
#18+
Док, что такое "блоб"? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.08.2017, 19:34:37 |
|
||
|
Lazarus: передача blob, как параметра, внутрь и наружу TThread
|
|||
|---|---|---|---|
|
#18+
schiВиноват, DataSet, которым я пользуюсь Вот в том то и дело. А для insert'а в базу DataSet не нужен. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.08.2017, 20:47:59 |
|
||
|
Lazarus: передача blob, как параметра, внутрь и наружу TThread
|
|||
|---|---|---|---|
|
#18+
чччДДок, что такое "блоб"? Бинарные данные произвольного размера (форматированный текст, картинки и проч.) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.08.2017, 20:55:33 |
|
||
|
Lazarus: передача blob, как параметра, внутрь и наружу TThread
|
|||
|---|---|---|---|
|
#18+
ДокчччДДок, что такое "блоб"? Бинарные данные произвольного размера (форматированный текст, картинки и проч.) Ну, загрузи эти данные из базы в память да передай в нить адрес начала блока и его длину. Например, с помощью TMemoryStream. Код: pascal 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. И передавай в нить этот самый fMS. Если блок данных очень уж велик, то сохраняй в файл: Код: pascal 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. ... или даже в файл, который будет автоматически удаляться, кода он станет не нужным: Код: pascal 1. 2. 3. 4. 5. ... а то и просто хэндл файла передавай. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.08.2017, 22:00:24 |
|
||
|
Lazarus: передача blob, как параметра, внутрь и наружу TThread
|
|||
|---|---|---|---|
|
#18+
YuRockschiВиноват, DataSet, которым я пользуюсь Вот в том то и дело. А для insert'а в базу DataSet не нужен. Может и не нужен, но с ним удобнее. Я не до конца понимаю, о чем дискуссия, правда :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.08.2017, 22:30:25 |
|
||
|
Lazarus: передача blob, как параметра, внутрь и наружу TThread
|
|||
|---|---|---|---|
|
#18+
чччД, во, спасибо. Завтра, когда моск включится, посмотрю твой код. Очень интересная реализация. зы. Вариант с временным файлом у меня давно реализован. Хочу уйти от него, т.к. могут быть потенциальные проблемы с правами на запись и проч.проч. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.08.2017, 22:37:07 |
|
||
|
Lazarus: передача blob, как параметра, внутрь и наружу TThread
|
|||
|---|---|---|---|
|
#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. 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. Чую, где-то косяк при передаче парамметров в WM_AddStreamParam_Msg. В Memo отображается "????", картинка пустая. ЧЯДНТ? зы. архив приложил ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.08.2017, 16:30:02 |
|
||
|
Lazarus: передача blob, как параметра, внутрь и наружу TThread
|
|||
|---|---|---|---|
|
#18+
Док, Навскидку вроде я не заметил огрехов. Но мне непонятно другое - зачем такой огород, почему тип нужных данных не передавать сразу в Stream хотя бы через Integer то есть, Код: pascal 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. К чему все эти сообщения и прочий геморрой ? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.08.2017, 16:56:43 |
|
||
|
Lazarus: передача blob, как параметра, внутрь и наружу TThread
|
|||
|---|---|---|---|
|
#18+
schiК чему все эти сообщения и прочий геморрой ? тут дело в постановке задачи. Скажем так, в данном случае, мне нужно передать массив байтов (или указатель на TMemoryStream, все равно его экземпляр будет жить до окончания жизни доп.потока) в доп.поток и вернуть его обратно. Т.о. образом я смогу, когда надо, передать blob в доп.поток (скажем, при записи в таблицу), а когда надо - передать blob в основной поток (например, при чтении из БД). зы. если ты смотрел сорцы приложенного архива, там есть вариант прямого копирования из контейнера в контейнер. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.08.2017, 17:25:43 |
|
||
|
Lazarus: передача blob, как параметра, внутрь и наружу TThread
|
|||
|---|---|---|---|
|
#18+
ДокschiК чему все эти сообщения и прочий геморрой ? тут дело в постановке задачи. Скажем так, в данном случае, мне нужно передать массив байтов (или указатель на TMemoryStream, все равно его экземпляр будет жить до окончания жизни доп.потока) в доп.поток и вернуть его обратно. Т.о. образом я смогу, когда надо, передать blob в доп.поток (скажем, при записи в таблицу), а когда надо - передать blob в основной поток (например, при чтении из БД). зы. если ты смотрел сорцы приложенного архива, там есть вариант прямого копирования из контейнера в контейнер. Смотрел, но не разбирался. Относительно потоков и прочих массивов - у всех потоков в процессе память общая, указатели можно передавать туда и сюда. Для blob'в хорошо подходят Stream-ы потому что их уже поддерживают blob-поля. Вот честно не понимаю, в чем проблема, с передачей разного рода объектов между потоками (да и между процессами тоже) имею дело давно, поэтому возможно чего-то у тебя не понимаю :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.08.2017, 17:53:04 |
|
||
|
Lazarus: передача blob, как параметра, внутрь и наружу TThread
|
|||
|---|---|---|---|
|
#18+
schiВот честно не понимаю, в чем проблема Хорошо, покажи (хотя бы схематично), как ты передаешь блобы из главного в доп. поток (если пишешь в базу) или из доп.потока в основной поток (если читаешь). Я с этим вопросом только начал разбираться, не совсем вкурил ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.08.2017, 18:00:34 |
|
||
|
Lazarus: передача blob, как параметра, внутрь и наружу TThread
|
|||
|---|---|---|---|
|
#18+
хех, голова садовая, забыл Execute доп.потока показать Код: pascal 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. schi, глянь, плз, корректно ли я передаю параметры в основной поток и корректно ли там их принимаю Код: pascal 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.08.2017, 18:08:54 |
|
||
|
Lazarus: передача blob, как параметра, внутрь и наружу TThread
|
|||
|---|---|---|---|
|
#18+
ДокschiВот честно не понимаю, в чем проблема Хорошо, покажи (хотя бы схематично), как ты передаешь блобы из главного в доп. поток (если пишешь в базу) или из доп.потока в основной поток (если читаешь). Я с этим вопросом только начал разбираться, не совсем вкурил Работа с базой: 20743953 между потоками передается указатель на некий контекст (AContext в коде), это запись, одно из полей которой - указатель на Stream. Разумеется, я опустил синхронизацию, но полагаю, что это азы. Докглянь, плз, корректно ли я передаю параметры в основной поток и корректно ли там их принимаю На мой беглый взгляд корректно, но почему бы тебе не сделать логирование и самому посмотреть ? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.08.2017, 18:58:20 |
|
||
|
Lazarus: передача blob, как параметра, внутрь и наружу TThread
|
|||
|---|---|---|---|
|
#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. 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. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.08.2017, 19:20:36 |
|
||
|
Lazarus: передача blob, как параметра, внутрь и наружу TThread
|
|||
|---|---|---|---|
|
#18+
С такой добавкой, а то не дописал - некрасиво, что не освобождается входящий стрим: Код: pascal 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.08.2017, 20:45:10 |
|
||
|
Lazarus: передача blob, как параметра, внутрь и наружу TThread
|
|||
|---|---|---|---|
|
#18+
schi, все, спасибо тебе большое - разобрался. В случае с передачей массивов байтов ошибка была в том, что Код: pascal 1. 2. 3. передавался 0, а не значение msg.wParam Переделал на твой вариант, тоже все зафурычило, только кода меньше Еще раз спасибо за познавательный код ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.08.2017, 23:30:56 |
|
||
|
Lazarus: передача blob, как параметра, внутрь и наружу TThread
|
|||
|---|---|---|---|
|
#18+
приаттачу проект для идущих следом :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.08.2017, 23:36:18 |
|
||
|
Lazarus: передача blob, как параметра, внутрь и наружу TThread
|
|||
|---|---|---|---|
|
#18+
schi, Код: pascal 1. 2. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.08.2017, 00:52:12 |
|
||
|
Lazarus: передача blob, как параметра, внутрь и наружу TThread
|
|||
|---|---|---|---|
|
#18+
чччДschi, Код: pascal 1. 2. Чтобы ты желтым выделил (Привычка у меня осталась при работе с TMemoryStream задавать ему размер) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.08.2017, 10:07:46 |
|
||
|
|

start [/forum/topic.php?all=1&fid=58&tid=2041886]: |
0ms |
get settings: |
10ms |
get forum list: |
18ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
178ms |
get topic data: |
12ms |
get forum data: |
4ms |
get page messages: |
71ms |
get tp. blocked users: |
1ms |
| others: | 199ms |
| total: | 499ms |

| 0 / 0 |
