|
|
|
Шаблон класса для работы с потоком (WThread, Thread)
|
|||
|---|---|---|---|
|
#18+
энди, поток на этом не останавливается. Что мешает присвоить Param любое свое значение на выходе из OnExecute? Этот же Param и будет в финише. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.01.2017, 10:11 |
|
||
|
Шаблон класса для работы с потоком (WThread, Thread)
|
|||
|---|---|---|---|
|
#18+
Просто получается что для того чтобы поймать raise из потока мне надо перехватывать messages. А мне на самом деле сообщения из потока вообще не нужны, мне надо просто запустить и понять в конце выполнения потока были ошибки или нет, вот и все. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.01.2017, 14:24 |
|
||
|
Шаблон класса для работы с потоком (WThread, Thread)
|
|||
|---|---|---|---|
|
#18+
эндиА мне на самом деле сообщения из потока вообще не нужны, мне надо просто запустить и понять в конце выполнения потока были ошибки или нет, вот и все. Как ты хочешь это понять, если обратную связь не хочешь получать? Попробуй из наследника TThread поймай exception. :) Хинт: он молча схлопнется. П.С. Ты кажется не понял концепцию моего потока: он работает (или спит) до конца работы приложения. Таск - это не поток, это сообщение для потока. Если хочешь обратную связь от таска (сообщения), придется потрудиться написать еще один обработчик. Иначе никак. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.01.2017, 18:13 |
|
||
|
Шаблон класса для работы с потоком (WThread, Thread)
|
|||
|---|---|---|---|
|
#18+
wadman, авторПопробуй из наследника TThread поймай exception. :) Я ловлю их и перезапускаю рухнувшие потоки. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.01.2017, 21:35 |
|
||
|
Шаблон класса для работы с потоком (WThread, Thread)
|
|||
|---|---|---|---|
|
#18+
makhaonwadman, авторПопробуй из наследника TThread поймай exception. :) Я ловлю их и перезапускаю рухнувшие потоки. Каким образом ловишь? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.01.2017, 21:55 |
|
||
|
Шаблон класса для работы с потоком (WThread, Thread)
|
|||
|---|---|---|---|
|
#18+
wadman, Обрабатываю OnTerminate, в нём при существовании FatalException считается, что поток упал. Создаю новый инстанс, присваиваю ссылку на поток ему. Стоит счетчик перезапусков, если он достиг порога - то считается, что поток умер фатально и перезапустить его автоматически не представляется возможным. Так обрабатываются несколько критичных потоков. Работает нормально. Сервера, работающие 365/7/24. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.01.2017, 22:46 |
|
||
|
Шаблон класса для работы с потоком (WThread, Thread)
|
|||
|---|---|---|---|
|
#18+
Но ведь посути ты возвращаешь мне информацию 2 способами, через messages и через finish таска, так почему надо возвращать информацию об ошибке внутри таска именно через messages, а не через finish? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.01.2017, 00:37 |
|
||
|
Шаблон класса для работы с потоком (WThread, Thread)
|
|||
|---|---|---|---|
|
#18+
эндитак почему надо возвращать информацию об ошибке внутри таска именно через messages, а не через finish? Дак что тебе мешает получить информацию через finish? Код: pascal 1. В Param в OnExecute ты можешь присвоить что угодно на выходе и оно в финише передастся. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.01.2017, 09:17 |
|
||
|
Шаблон класса для работы с потоком (WThread, Thread)
|
|||
|---|---|---|---|
|
#18+
makhaonТак обрабатываются несколько критичных потоков. Интересный подход, но не лучше-ли если не писать не падающий код, то хотя-бы не убивать и запускать поток лишний раз? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.01.2017, 09:18 |
|
||
|
Шаблон класса для работы с потоком (WThread, Thread)
|
|||
|---|---|---|---|
|
#18+
Не падающий код это утопия :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.01.2017, 10:00 |
|
||
|
Шаблон класса для работы с потоком (WThread, Thread)
|
|||
|---|---|---|---|
|
#18+
wadman, Код максимально чистится, и продолжает. Абсолютное большинство вопросов почистилось еще у себя на тестах. Стараемся исправлять каждое. Но, к сожалению, единичные исключения всё еще бывают, хотя в последнее время всё реже. Не всё удаётся найти. "хотя-бы не убивать и запускать поток лишний раз" Я поток не убиваю. Если в execute случается необработанное исключение - то поток заканчивается и убивается сам. Можно, конечно, все исключения ловить и не выпускать 'за' execute, но это плохой подход. В случае, например, AV это почти гарантированно закончится фатально для всего сервиса. Перезапуск потока же часто спасает ситуацию. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.01.2017, 12:17 |
|
||
|
Шаблон класса для работы с потоком (WThread, Thread)
|
|||
|---|---|---|---|
|
#18+
Посидел повертел тут таски на реальных задачах и понял что меня смущает. 1) word передаваемый в start потока, зачем? если еще один доп параметр то за ним вроде как вариант идет и можно там его гонять если очень хочется что-то в таск передать. 2) variant в качестве входного параметра не сказать чтобы очень удобен, я привык параметры гонять с помощью коллекций и обычно пользую тупо TParams из db.pas. Он позволяет иметь кучу типов параметров, читаем и пишем как хотим без всякой сериализации/десериализации в Variant 3) Зачем вообще все эти входные параметры если можно иметь банальный набор значений в той же форме и зачитать их уже в самом таске. Вопрос многопоточности в этом случае не стоит так как таски выполняются последовательно. 4) Идеальным вариантом параметра для start выглядит имя процедуры которую таск уже запускает внутри себя в отдельном потоке. Тогда не надо на каждый чих заводить отдельный таск. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.02.2017, 19:53 |
|
||
|
Шаблон класса для работы с потоком (WThread, Thread)
|
|||
|---|---|---|---|
|
#18+
энди1) word передаваемый в start потока, зачем? Можешь не использовать. Там три варианта Start, один из них без параметров. энди2) variant в качестве входного параметра не сказать чтобы очень удобен, я привык параметры гонять с помощью коллекций и обычно пользую тупо TParams из db.pas. Он позволяет иметь кучу типов параметров, читаем и пишем как хотим без всякой сериализации/десериализации в Variant В варианте можно передать и массив. И массив массивов. И т.д. :) энди3) Зачем вообще все эти входные параметры если можно иметь банальный набор значений в той же форме и зачитать их уже в самом таске. Вопрос многопоточности в этом случае не стоит так как таски выполняются последовательно. Они выполняются относительно доп.потока последовательно, но для основного потока они выполняются параллельно. Задача на смекалку: Код: pascal 1. 2. 3. 4. 5. 6. Какое значение будет в SomeValue, когда запустится таск первый и второй раз? подсказка, не подглядывай Для первого раза там в 99% случаев будет уже 3, для второго будет 3 уже 100% энди4) Идеальным вариантом параметра для start выглядит имя процедуры которую таск уже запускает внутри себя в отдельном потоке. Тогда не надо на каждый чих заводить отдельный таск. Этот вариант уже сделан. В обработчике OnExecute, который и является процедурой. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.02.2017, 10:47 |
|
||
|
Шаблон класса для работы с потоком (WThread, Thread)
|
|||
|---|---|---|---|
|
#18+
Ну у меня в основном потоке красивая форма прогресса отрисовывается с анимацией, так что очереди тасков у меня не будет даже чисто теоретически. Так что проблемы с глобальными переменными быть не может. Да и передавать через вариант скажем набор разнотипных объектов или переменных не так чтобы совсем уж логично. Хотя конечно это личное дело каждого. На самом деле лвиная доля типовых тасков это типовые операции с датасетом, открытие например. Так что таск на открытие можно иметь один, просто передавать в него датасет который там уже и открывать попутно отрисовывая красивое окно ожидания. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.02.2017, 12:30 |
|
||
|
Шаблон класса для работы с потоком (WThread, Thread)
|
|||
|---|---|---|---|
|
#18+
энди, не понимаю. Предлагаешь урезать функционал под тебя? Перепиши как хочешь, исходники полностью доступны. Уж извини, что тоже пользуюсь библиотекой и не ограничиваюсь только одним случаем. И копирование файлов идет фоном в два потока, и непрерывная печать на упаковке, и формирование выгрузок в эксель и т.д. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.02.2017, 13:23 |
|
||
|
Шаблон класса для работы с потоком (WThread, Thread)
|
|||
|---|---|---|---|
|
#18+
да не, я не претензии, все равно спасибо за либу, снимает головную боль а так да, я уже кривенького наследника накропал под свои типы задач :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.02.2017, 19:12 |
|
||
|
Шаблон класса для работы с потоком (WThread, Thread)
|
|||
|---|---|---|---|
|
#18+
wadman, иконки не было в комплекте или она потерялась? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.04.2017, 22:18 |
|
||
|
Шаблон класса для работы с потоком (WThread, Thread)
|
|||
|---|---|---|---|
|
#18+
Докиконки не было в комплекте или она потерялась? Не было. На кой она? :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.04.2017, 09:07 |
|
||
|
Шаблон класса для работы с потоком (WThread, Thread)
|
|||
|---|---|---|---|
|
#18+
Убрал StopThread (Terminate удобнее). Добавил возможность стартовать поток 2 из потока 1 с обратной связью в поток 1 (а не VCL/LCL). Тут нужно понимать, что используется механизм сообщений и обратная связь идет через очередь потока 1. Убрал жуткую ошибку, которая тянулась с самого начала, но вылезла только на стресс-тесте в внезапным закрытием, когда потоки во всю "общаются". Ну и исправления по мелочи... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.04.2017, 08:46 |
|
||
|
Шаблон класса для работы с потоком (WThread, Thread)
|
|||
|---|---|---|---|
|
#18+
wadman, из simpledemo - В TaskDemoTimerExecute поменял с 1000 на 5000: Код: pascal 1. 2. При закрытии приложения - падает при вызове GetTerminated автор--------------------------- Debugger Exception Notification --------------------------- Project Project1.exe raised exception class EAccessViolation with message 'Access violation at address 00456F74 in module 'Project1.exe'. Read of address 00000050'. Process stopped. Use Step or Run to continue. --------------------------- OK Help --------------------------- ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.04.2017, 10:07 |
|
||
|
Шаблон класса для работы с потоком (WThread, Thread)
|
|||
|---|---|---|---|
|
#18+
sql2012, логично. Компонента то шлепнута. Либо замени слип на работу с проверкой терминатора, либо увеличь интервал ожидания в finishalltasks в деструкторе формы. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.04.2017, 11:04 |
|
||
|
Шаблон класса для работы с потоком (WThread, Thread)
|
|||
|---|---|---|---|
|
#18+
wadman, Спасибо. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.04.2017, 11:23 |
|
||
|
Шаблон класса для работы с потоком (WThread, Thread)
|
|||
|---|---|---|---|
|
#18+
Залил на гитхаб: https://github.com/wadman/wthread/ Из последних изменений: поток для синхронного вызова vcl/lcl перевел в режим singleton. Как раньше не догадался? При большом количестве потоков большой и не нужный расход памяти и дескрипторов. Теперь таски по умолчанию принудительно прибиваются при Destroy, если не вызвать явно ожидание их работы (FinishAllTasks, WaitAllTasks). Раньше было наоборот. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.07.2017, 13:28 |
|
||
|
Шаблон класса для работы с потоком (WThread, Thread)
|
|||
|---|---|---|---|
|
#18+
Добавил TWEvent.WaitForMultiple, который, соответственно, работает только со своим классом. Подходит для синхронизации нескольких потоков TWThread, TWCThread. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.10.2017, 11:17 |
|
||
|
|

start [/forum/topic.php?fid=58&startmsg=39393948&tid=2039179]: |
0ms |
get settings: |
6ms |
get forum list: |
15ms |
check forum access: |
2ms |
check topic access: |
2ms |
track hit: |
44ms |
get topic data: |
9ms |
get forum data: |
2ms |
get page messages: |
57ms |
get tp. blocked users: |
1ms |
| others: | 205ms |
| total: | 343ms |

| 0 / 0 |
