|
|
|
Шаблон класса для работы с потоком (WThread, Thread)
|
|||
|---|---|---|---|
|
#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. 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. 219. 220. 221. 222. 223. 224. 225. 226. 227. 228. 229. 230. Тестовый проект. Форма состоит из мemo, и двух кнопок: одна запускает/останавливает поток, другая отправляет строку в поток. Код: 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. Тестирование было с ReportMemoryLeaksOnShutdown := true; что показало, что память не теряется при многочисленных отправках строк. Delphi XE2. Вопросы, предложения? :) Репозитарий на гитхабе: https://github.com/wadman/wthread/ ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.09.2013, 13:10 |
|
||
|
Шаблон класса для работы с потоком (WThread, Thread)
|
|||
|---|---|---|---|
|
#18+
wadman, 1. KISS 2. RTFM твой WM_STRING - это PSM_SHEETINFO. маловероятно, конечно, что система догадается посласть его твоему окну, но когда догадается таки - ожидаемой строки ты там не найдешь)) 3. зачем отправлять всего лишь Word, когда "по ширине" вполне пролазит WPARAM? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.09.2013, 14:41 |
|
||
|
Шаблон класса для работы с потоком (WThread, Thread)
|
|||
|---|---|---|---|
|
#18+
fd00ch KISS Не осилил, поясни. Если речь о Terminate и goto, то считай это перестраховкой для начинающего. fd00chтвой WM_STRING - это PSM_SHEETINFO. WM_USER + $100 + 1 <> WM_USER+101 fd00chзачем отправлять всего лишь Word, когда "по ширине" вполне пролазит WPARAM? Можно и так. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.09.2013, 14:50 |
|
||
|
Шаблон класса для работы с потоком (WThread, Thread)
|
|||
|---|---|---|---|
|
#18+
wadmanWM_USER + $100 + 1 <> WM_USER+101профнепригодность, блин, доллары перестаю замечать wadmanНе осилил, пояснизачем писать сложно, когда можно просто? у тебя задача потока в чем заключается? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.09.2013, 15:09 |
|
||
|
Шаблон класса для работы с потоком (WThread, Thread)
|
|||
|---|---|---|---|
|
#18+
fd00chу тебя задача потока в чем заключается? У меня - ни в чем. Свистоперделка Конкретный вопрос задай. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.09.2013, 15:14 |
|
||
|
Шаблон класса для работы с потоком (WThread, Thread)
|
|||
|---|---|---|---|
|
#18+
1. зачем нужен такой поток? 2. зачем потоку нужны сообщающие о принятых данных события, которые не синхронизированы ни с чем? 3. по мотивам п.2. в чьем контексте вызывается TfrmWThreadTest.ReceiveString с обращением к Memo1? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.09.2013, 15:32 |
|
||
|
Шаблон класса для работы с потоком (WThread, Thread)
|
|||
|---|---|---|---|
|
#18+
wadman, Не понял для чего шаблон потока. Сделай пояснения, please. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.09.2013, 15:36 |
|
||
|
Шаблон класса для работы с потоком (WThread, Thread)
|
|||
|---|---|---|---|
|
#18+
fd00ch1. зачем нужен такой поток? 2. зачем потоку нужны сообщающие о принятых данных события, которые не синхронизированы ни с чем? Это шаблон. fd00chв чьем контексте вызывается TfrmWThreadTest.ReceiveString с обращением к Memo1? Естественно в главном потоке, который обслуживает VCL. Как и все, что дергается из WWindowProc. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.09.2013, 15:37 |
|
||
|
Шаблон класса для работы с потоком (WThread, Thread)
|
|||
|---|---|---|---|
|
#18+
Aleksey V.P.Сделай пояснения, please. Для людей, которые создают такие темы: http://www.sql.ru/forum/1050309/tthread-nuzhna-li-v-privedennom-kode-sinhronizaciya http://www.sql.ru/forum/1050203/obrashhenie-k-forme-iz-thread http://www.sql.ru/forum/1049953/osnovy-tthread ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.09.2013, 15:39 |
|
||
|
Шаблон класса для работы с потоком (WThread, Thread)
|
|||
|---|---|---|---|
|
#18+
Я вижу в тексте слово GOTO - код КГ/АМ ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.09.2013, 15:47 |
|
||
|
Шаблон класса для работы с потоком (WThread, Thread)
|
|||
|---|---|---|---|
|
#18+
defecatorЯ вижу в тексте слово GOTO - код КГ/АМ Перед этим Label не заметил? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.09.2013, 15:49 |
|
||
|
Шаблон класса для работы с потоком (WThread, Thread)
|
|||
|---|---|---|---|
|
#18+
wadmanДля людей, которые создают такие темы: http://www.sql.ru/forum/1050309/tthread-nuzhna-li-v-privedennom-kode-sinhronizaciya http://www.sql.ru/forum/1050203/obrashhenie-k-forme-iz-thread http://www.sql.ru/forum/1049953/osnovy-tthread Спасиба за пояснения, буэшечку словил. Поясни смысл использования оператора GoTo, без него никак не обойтись? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.09.2013, 15:50 |
|
||
|
Шаблон класса для работы с потоком (WThread, Thread)
|
|||
|---|---|---|---|
|
#18+
wadman, Например использовать try .. finally .. end.. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.09.2013, 15:55 |
|
||
|
Шаблон класса для работы с потоком (WThread, Thread)
|
|||
|---|---|---|---|
|
#18+
Aleksey V.P.без него никак не обойтись? Обойтись, тот же break. Только я не сторонник бинарной логики "если, то", то есть если выполняется, как заложено, то нехай буде. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.09.2013, 15:55 |
|
||
|
Шаблон класса для работы с потоком (WThread, Thread)
|
|||
|---|---|---|---|
|
#18+
Aleksey V.P.Например использовать try .. finally .. end.. В этом коде это лишнее. Раз уж такой любитель процедурных вызовов, то try должны расставлены быть в вызываемых процедурах. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.09.2013, 15:57 |
|
||
|
Шаблон класса для работы с потоком (WThread, Thread)
|
|||
|---|---|---|---|
|
#18+
wadmanЕстественно в главном потоке, который обслуживает VCL. Как и все, что дергается из WWindowProc.да, прощелкал, что создание окна идет из конструктора, а не из Execute ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.09.2013, 16:00 |
|
||
|
Шаблон класса для работы с потоком (WThread, Thread)
|
|||
|---|---|---|---|
|
#18+
wadman http://www.sql.ru/forum/1050203/obrashhenie-k-forme-iz-thread 14899112 Пример на основе моего модуля: 1. Добавляется процедура своего парсера. 2. В Execute ловится любой свой код посредством SendMessageToThread и процедура запускается. 3. Из потока вполне себе можно отправлять сообщения: прогресс выполнения, коды действия, диагностические сообщения и т.п. Код: 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. 219. 220. 221. 222. 223. 224. 225. 226. 227. 228. 229. 230. 231. 232. 233. 234. 235. 236. 237. 238. 239. 240. 241. 242. 243. 244. 245. 246. 247. 248. 249. 250. 251. 252. 253. 254. 255. 256. 257. 258. 259. 260. То есть поток выполняется всегда, но когда не парсит, то ожидает "приказа" в виде SendStringIntToThread(77, 'http://ya.ru') ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.09.2013, 16:19 |
|
||
|
Шаблон класса для работы с потоком (WThread, Thread)
|
|||
|---|---|---|---|
|
#18+
wadman, Блин, как-то всё необоснованно сложно завернуто. Нет никакого стека для присланных URL, если поток не пропарсил предыдущий URL, то передать следующий URL будет проблематично. Особенно если это связано с большими ресурсными затратами или с обращением к устройствам ввода/вывода. Предлагаю изменить для теста код твоего потока следующим образом: procedure TWThread.ParseUrl(const URL: string); begin SendString('Begin parsing...'); // парсер Sleep(1000); SendString('Done parsing...'); end; и попробовать пообращаться к потоку раз в пол секунды с разными урлами. Сколько урлов пропарсит твой поток? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.09.2013, 17:19 |
|
||
|
Шаблон класса для работы с потоком (WThread, Thread)
|
|||
|---|---|---|---|
|
#18+
DimonkaНет никакого стека для присланных URL Откуда такая информация? DimonkaСколько урлов пропарсит твой поток? Столько, сколько вмещает очередь сообщений ОС. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.09.2013, 17:28 |
|
||
|
Шаблон класса для работы с потоком (WThread, Thread)
|
|||
|---|---|---|---|
|
#18+
Но именно в случае парсером страниц я бы сделал не один, а 50 потоков, регулируемых из главного, а не пихал бы всю работу в один доп поток. И при этом анализировал бы занятость потоков. Благо для этого (диалога между основным и доп потоком) тут все предусмотрено. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.09.2013, 17:38 |
|
||
|
Шаблон класса для работы с потоком (WThread, Thread)
|
|||
|---|---|---|---|
|
#18+
Завтра напишу чуть более сложный пример для 50-ти потоков, которые стартуют случайно, отсчитывают случайное количество секунд и сообщают о своей работу основному потоку. Никаких тормозов интерфейса при этом не будет. Примерно такой метод работы с устройствами у меня используется на производстве. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.09.2013, 18:32 |
|
||
|
Шаблон класса для работы с потоком (WThread, Thread)
|
|||
|---|---|---|---|
|
#18+
wadmanDimonkaНет никакого стека для присланных URL Откуда такая информация? DimonkaСколько урлов пропарсит твой поток? Столько, сколько вмещает очередь сообщений ОС. Ну так вот в том-то и дело, что поток использует очередь сообщений, а не очередь заданий. Отправителю надо будет хранить урлы, пока их не обработает поток. Напиши код по обработке 2х урлов применро так: Код: pascal 1. 2. 3. 4. 5. и посмотри, что он тебе выдаст. Только не забудь поставить sleep(20) в парсинг урлов для изображения непосильного труда. зы DoParseURL() должен посылать какие надо команды для парсинга. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.09.2013, 18:55 |
|
||
|
Шаблон класса для работы с потоком (WThread, Thread)
|
|||
|---|---|---|---|
|
#18+
Dimonka, сам напиши DoParseUrl и покажи, что в нем не так. У меня впечатление, что ты не понимаешь до конца, как это работает. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.09.2013, 19:23 |
|
||
|
Шаблон класса для работы с потоком (WThread, Thread)
|
|||
|---|---|---|---|
|
#18+
2 wadman Не вчитывался ни в класс, ни в шаблон, ни в ваш диалог, но на беглый взгляд - я бы ни в коем, НИ В КОЕМ случае не использовал сообщения/события для обмена данными, только для сигнализации. Тем более в шаблоне потока. Posted via ActualForum NNTP Server 1.5 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.09.2013, 19:30 |
|
||
|
Шаблон класса для работы с потоком (WThread, Thread)
|
|||
|---|---|---|---|
|
#18+
wadman, я так полагаю, это будет что-то вроде этого? Код: pascal 1. 2. 3. 4. 5. Можешь тестировать :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.09.2013, 19:36 |
|
||
|
|

start [/forum/topic.php?fid=58&msg=38411716&tid=2039179]: |
0ms |
get settings: |
8ms |
get forum list: |
13ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
170ms |
get topic data: |
8ms |
get forum data: |
2ms |
get page messages: |
55ms |
get tp. blocked users: |
1ms |
| others: | 224ms |
| total: | 487ms |

| 0 / 0 |
