Добро пожаловать в форум, Guest >> Войти | Регистрация | Поиск | Правила | | В избранное | Подписаться | ||
Все форумы / Delphi |
![]() ![]() |
Топик располагается на нескольких страницах: [1] 2 3 4 5 6 7 8 9 10 .. 19 вперед Ctrl→ |
wadman Member Откуда: Санкт-Петербург Сообщений: 26903 |
Собственно, сам шаблон с небольшими комментариями именно в тех местах, которые нужны на обывательском уровне, чтобы только добавить свой код.
Тестовый проект. Форма состоит из мemo, и двух кнопок: одна запускает/останавливает поток, другая отправляет строку в поток.
Тестирование было с ReportMemoryLeaksOnShutdown := true; что показало, что память не теряется при многочисленных отправках строк. Delphi XE2. Вопросы, предложения? :) Репозитарий на гитхабе: https://github.com/wadman/wthread/ Сообщение было отредактировано: 10 июл 17, 14:09 |
||
30 сен 13, 13:10 [14900985] Ответить | Цитировать Сообщить модератору |
fd00ch Member Откуда: Нижний Новгород Сообщений: 5913 |
wadman, 1. KISS 2. RTFM твой WM_STRING - это PSM_SHEETINFO. маловероятно, конечно, что система догадается посласть его твоему окну, но когда догадается таки - ожидаемой строки ты там не найдешь)) 3. зачем отправлять всего лишь Word, когда "по ширине" вполне пролазит WPARAM? |
30 сен 13, 14:41 [14901875] Ответить | Цитировать Сообщить модератору |
wadman Member Откуда: Санкт-Петербург Сообщений: 26903 |
Не осилил, поясни. Если речь о Terminate и goto, то считай это перестраховкой для начинающего.
WM_USER + $100 + 1 <> WM_USER+101 ![]()
Можно и так. |
||||||
30 сен 13, 14:50 [14901950] Ответить | Цитировать Сообщить модератору |
fd00ch Member Откуда: Нижний Новгород Сообщений: 5913 |
![]()
|
||||
30 сен 13, 15:09 [14902083] Ответить | Цитировать Сообщить модератору |
wadman Member Откуда: Санкт-Петербург Сообщений: 26903 |
У меня - ни в чем. Свистоперделка ![]() |
||
30 сен 13, 15:14 [14902111] Ответить | Цитировать Сообщить модератору |
fd00ch Member Откуда: Нижний Новгород Сообщений: 5913 |
1. зачем нужен такой поток? 2. зачем потоку нужны сообщающие о принятых данных события, которые не синхронизированы ни с чем? 3. по мотивам п.2. в чьем контексте вызывается TfrmWThreadTest.ReceiveString с обращением к Memo1? |
30 сен 13, 15:32 [14902230] Ответить | Цитировать Сообщить модератору |
Aleksey V.P. Member Откуда: Москва Сообщений: 575 |
wadman, Не понял для чего шаблон потока. Сделай пояснения, please. |
30 сен 13, 15:36 [14902250] Ответить | Цитировать Сообщить модератору |
wadman Member Откуда: Санкт-Петербург Сообщений: 26903 |
Это шаблон.
Естественно в главном потоке, который обслуживает VCL. Как и все, что дергается из WWindowProc. |
||||
30 сен 13, 15:37 [14902256] Ответить | Цитировать Сообщить модератору |
wadman Member Откуда: Санкт-Петербург Сообщений: 26903 |
Для людей, которые создают такие темы: https://www.sql.ru/forum/1050309/tthread-nuzhna-li-v-privedennom-kode-sinhronizaciya https://www.sql.ru/forum/1050203/obrashhenie-k-forme-iz-thread https://www.sql.ru/forum/1049953/osnovy-tthread |
||
30 сен 13, 15:39 [14902265] Ответить | Цитировать Сообщить модератору |
defecator Member Откуда: Сообщений: 39567 |
Я вижу в тексте слово GOTO - код КГ/АМ |
30 сен 13, 15:47 [14902305] Ответить | Цитировать Сообщить модератору |
wadman Member Откуда: Санкт-Петербург Сообщений: 26903 |
Перед этим Label не заметил? |
||
30 сен 13, 15:49 [14902318] Ответить | Цитировать Сообщить модератору |
Aleksey V.P. Member Откуда: Москва Сообщений: 575 |
Спасиба за пояснения, буэшечку словил. Поясни смысл использования оператора GoTo, без него никак не обойтись? |
30 сен 13, 15:50 [14902325] Ответить | Цитировать Сообщить модератору |
Aleksey V.P. Member Откуда: Москва Сообщений: 575 |
wadman, Например использовать try .. finally .. end.. |
30 сен 13, 15:55 [14902353] Ответить | Цитировать Сообщить модератору |
wadman Member Откуда: Санкт-Петербург Сообщений: 26903 |
Обойтись, тот же break. Только я не сторонник бинарной логики "если, то", то есть если выполняется, как заложено, то нехай буде. |
||
30 сен 13, 15:55 [14902356] Ответить | Цитировать Сообщить модератору |
wadman Member Откуда: Санкт-Петербург Сообщений: 26903 |
В этом коде это лишнее. Раз уж такой любитель процедурных вызовов, то try должны расставлены быть в вызываемых процедурах. |
||
30 сен 13, 15:57 [14902366] Ответить | Цитировать Сообщить модератору |
fd00ch Member Откуда: Нижний Новгород Сообщений: 5913 |
|
||
30 сен 13, 16:00 [14902375] Ответить | Цитировать Сообщить модератору |
wadman Member Откуда: Санкт-Петербург Сообщений: 26903 |
14899112 Пример на основе моего модуля: 1. Добавляется процедура своего парсера. 2. В Execute ловится любой свой код посредством SendMessageToThread и процедура запускается. 3. Из потока вполне себе можно отправлять сообщения: прогресс выполнения, коды действия, диагностические сообщения и т.п.
То есть поток выполняется всегда, но когда не парсит, то ожидает "приказа" в виде SendStringIntToThread(77, 'http://ya.ru') |
|||
30 сен 13, 16:19 [14902497] Ответить | Цитировать Сообщить модератору |
Dimonka Member Откуда: Сообщений: 1178 |
wadman, Блин, как-то всё необоснованно сложно завернуто. Нет никакого стека для присланных URL, если поток не пропарсил предыдущий URL, то передать следующий URL будет проблематично. Особенно если это связано с большими ресурсными затратами или с обращением к устройствам ввода/вывода. Предлагаю изменить для теста код твоего потока следующим образом: procedure TWThread.ParseUrl(const URL: string); begin SendString('Begin parsing...'); // парсер Sleep(1000); SendString('Done parsing...'); end; и попробовать пообращаться к потоку раз в пол секунды с разными урлами. Сколько урлов пропарсит твой поток? |
30 сен 13, 17:19 [14902835] Ответить | Цитировать Сообщить модератору |
wadman Member Откуда: Санкт-Петербург Сообщений: 26903 |
Откуда такая информация?
Столько, сколько вмещает очередь сообщений ОС. |
||||
30 сен 13, 17:28 [14902890] Ответить | Цитировать Сообщить модератору |
wadman Member Откуда: Санкт-Петербург Сообщений: 26903 |
Но именно в случае парсером страниц я бы сделал не один, а 50 потоков, регулируемых из главного, а не пихал бы всю работу в один доп поток. И при этом анализировал бы занятость потоков. Благо для этого (диалога между основным и доп потоком) тут все предусмотрено. |
30 сен 13, 17:38 [14902937] Ответить | Цитировать Сообщить модератору |
wadman Member Откуда: Санкт-Петербург Сообщений: 26903 |
Завтра напишу чуть более сложный пример для 50-ти потоков, которые стартуют случайно, отсчитывают случайное количество секунд и сообщают о своей работу основному потоку. Никаких тормозов интерфейса при этом не будет. Примерно такой метод работы с устройствами у меня используется на производстве. |
30 сен 13, 18:32 [14903287] Ответить | Цитировать Сообщить модератору |
Dimonka Member Откуда: Сообщений: 1178 |
Ну так вот в том-то и дело, что поток использует очередь сообщений, а не очередь заданий. Отправителю надо будет хранить урлы, пока их не обработает поток. Напиши код по обработке 2х урлов применро так: s := "123"; Thread.DoParseURL(s); s := "321"; Thread.DoParseURL(s); s := "";и посмотри, что он тебе выдаст. Только не забудь поставить sleep(20) в парсинг урлов для изображения непосильного труда. зы DoParseURL() должен посылать какие надо команды для парсинга. |
||||||
30 сен 13, 18:55 [14903409] Ответить | Цитировать Сообщить модератору |
wadman Member Откуда: Санкт-Петербург Сообщений: 26903 |
Dimonka, сам напиши DoParseUrl и покажи, что в нем не так. У меня впечатление, что ты не понимаешь до конца, как это работает. |
30 сен 13, 19:23 [14903515] Ответить | Цитировать Сообщить модератору |
Гаджимурадов Рустам Member Откуда: Сообщений: 62245 |
2 wadman Не вчитывался ни в класс, ни в шаблон, ни в ваш диалог, но на беглый взгляд - я бы ни в коем, НИ В КОЕМ случае не использовал сообщения/события для обмена данными, только для сигнализации. Тем более в шаблоне потока. Posted via ActualForum NNTP Server 1.5 |
30 сен 13, 19:30 [14903539] Ответить | Цитировать Сообщить модератору |
Dimonka Member Откуда: Сообщений: 1178 |
wadman, я так полагаю, это будет что-то вроде этого? procedure TWThread.DoParseURL(const URL: string); begin SendStringWord(URL, 77); end; Можешь тестировать :) |
30 сен 13, 19:36 [14903554] Ответить | Цитировать Сообщить модератору |
Топик располагается на нескольких страницах: [1] 2 3 4 5 6 7 8 9 10 .. 19 вперед Ctrl→ |
Все форумы / Delphi | ![]() |