powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Шаблон класса для работы с потоком (WThread, Thread)
25 сообщений из 469, страница 16 из 19
Шаблон класса для работы с потоком (WThread, Thread)
    #39393948
Фотография wadman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
энди,

поток на этом не останавливается.
Что мешает присвоить Param любое свое значение на выходе из OnExecute?
Этот же Param и будет в финише.
...
Рейтинг: 0 / 0
Шаблон класса для работы с потоком (WThread, Thread)
    #39394008
энди
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Просто получается что для того чтобы поймать raise из потока мне надо перехватывать messages. А мне на самом деле сообщения из потока вообще не нужны, мне надо просто запустить и понять в конце выполнения потока были ошибки или нет, вот и все.
...
Рейтинг: 0 / 0
Шаблон класса для работы с потоком (WThread, Thread)
    #39394111
Фотография wadman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
эндиА мне на самом деле сообщения из потока вообще не нужны, мне надо просто запустить и понять в конце выполнения потока были ошибки или нет, вот и все.
Как ты хочешь это понять, если обратную связь не хочешь получать?
Попробуй из наследника TThread поймай exception. :)
Хинт: он молча схлопнется.


П.С. Ты кажется не понял концепцию моего потока: он работает (или спит) до конца работы приложения. Таск - это не поток, это сообщение для потока. Если хочешь обратную связь от таска (сообщения), придется потрудиться написать еще один обработчик. Иначе никак.
...
Рейтинг: 0 / 0
Шаблон класса для работы с потоком (WThread, Thread)
    #39394218
Фотография makhaon
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
wadman,

авторПопробуй из наследника TThread поймай exception. :)

Я ловлю их и перезапускаю рухнувшие потоки.
...
Рейтинг: 0 / 0
Шаблон класса для работы с потоком (WThread, Thread)
    #39394232
Фотография wadman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
makhaonwadman,

авторПопробуй из наследника TThread поймай exception. :)

Я ловлю их и перезапускаю рухнувшие потоки.
Каким образом ловишь?
...
Рейтинг: 0 / 0
Шаблон класса для работы с потоком (WThread, Thread)
    #39394253
Фотография makhaon
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
wadman,

Обрабатываю OnTerminate, в нём при существовании FatalException считается, что поток упал. Создаю новый инстанс, присваиваю ссылку на поток ему. Стоит счетчик перезапусков, если он достиг порога - то считается, что поток умер фатально и перезапустить его автоматически не представляется возможным. Так обрабатываются несколько критичных потоков. Работает нормально.
Сервера, работающие 365/7/24.
...
Рейтинг: 0 / 0
Шаблон класса для работы с потоком (WThread, Thread)
    #39394287
энди
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Но ведь посути ты возвращаешь мне информацию 2 способами, через messages и через finish таска, так почему надо возвращать информацию об ошибке внутри таска именно через messages, а не через finish?
...
Рейтинг: 0 / 0
Шаблон класса для работы с потоком (WThread, Thread)
    #39394364
Фотография wadman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
эндитак почему надо возвращать информацию об ошибке внутри таска именно через messages, а не через finish?
Дак что тебе мешает получить информацию через finish?
Код: pascal
1.
TTaskFinish     = procedure(const Sender: TTask; const Msg: Word; const Param: Variant) of object;


В Param в OnExecute ты можешь присвоить что угодно на выходе и оно в финише передастся.
...
Рейтинг: 0 / 0
Шаблон класса для работы с потоком (WThread, Thread)
    #39394366
Фотография wadman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
makhaonТак обрабатываются несколько критичных потоков.
Интересный подход, но не лучше-ли если не писать не падающий код, то хотя-бы не убивать и запускать поток лишний раз?
...
Рейтинг: 0 / 0
Шаблон класса для работы с потоком (WThread, Thread)
    #39394391
энди
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Не падающий код это утопия :)
...
Рейтинг: 0 / 0
Шаблон класса для работы с потоком (WThread, Thread)
    #39394507
Фотография makhaon
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
wadman,

Код максимально чистится, и продолжает. Абсолютное большинство вопросов почистилось еще у себя на тестах. Стараемся исправлять каждое. Но, к сожалению, единичные исключения всё еще бывают, хотя в последнее время всё реже. Не всё удаётся найти.

"хотя-бы не убивать и запускать поток лишний раз"

Я поток не убиваю. Если в execute случается необработанное исключение - то поток заканчивается и убивается сам. Можно, конечно, все исключения ловить и не выпускать 'за' execute, но это плохой подход. В случае, например, AV это почти гарантированно закончится фатально для всего сервиса. Перезапуск потока же часто спасает ситуацию.
...
Рейтинг: 0 / 0
Шаблон класса для работы с потоком (WThread, Thread)
    #39402469
энди
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Посидел повертел тут таски на реальных задачах и понял что меня смущает.
1) word передаваемый в start потока, зачем? если еще один доп параметр то за ним вроде как вариант идет и можно там его гонять если очень хочется что-то в таск передать.
2) variant в качестве входного параметра не сказать чтобы очень удобен, я привык параметры гонять с помощью коллекций и обычно пользую тупо TParams из db.pas. Он позволяет иметь кучу типов параметров, читаем и пишем как хотим без всякой сериализации/десериализации в Variant
3) Зачем вообще все эти входные параметры если можно иметь банальный набор значений в той же форме и зачитать их уже в самом таске. Вопрос многопоточности в этом случае не стоит так как таски выполняются последовательно.
4) Идеальным вариантом параметра для start выглядит имя процедуры которую таск уже запускает внутри себя в отдельном потоке. Тогда не надо на каждый чих заводить отдельный таск.
...
Рейтинг: 0 / 0
Шаблон класса для работы с потоком (WThread, Thread)
    #39402584
Фотография wadman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
энди1) word передаваемый в start потока, зачем?
Можешь не использовать. Там три варианта Start, один из них без параметров.
энди2) variant в качестве входного параметра не сказать чтобы очень удобен, я привык параметры гонять с помощью коллекций и обычно пользую тупо TParams из db.pas. Он позволяет иметь кучу типов параметров, читаем и пишем как хотим без всякой сериализации/десериализации в Variant
В варианте можно передать и массив. И массив массивов. И т.д. :)
энди3) Зачем вообще все эти входные параметры если можно иметь банальный набор значений в той же форме и зачитать их уже в самом таске. Вопрос многопоточности в этом случае не стоит так как таски выполняются последовательно.
Они выполняются относительно доп.потока последовательно, но для основного потока они выполняются параллельно.
Задача на смекалку:
Код: pascal
1.
2.
3.
4.
5.
6.
form1.SomeValue := 1;
Task1.Start; // выполняется минуту
form1.SomeValue := 2;
Task1.Start; // выполняется минуту
form1.SomeValue := 3;
Task1.Start; // тоже минуту


Какое значение будет в SomeValue, когда запустится таск первый и второй раз?
подсказка, не подглядывай
Для первого раза там в 99% случаев будет уже 3, для второго будет 3 уже 100%

энди4) Идеальным вариантом параметра для start выглядит имя процедуры которую таск уже запускает внутри себя в отдельном потоке. Тогда не надо на каждый чих заводить отдельный таск.
Этот вариант уже сделан. В обработчике OnExecute, который и является процедурой.
...
Рейтинг: 0 / 0
Шаблон класса для работы с потоком (WThread, Thread)
    #39402617
энди
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ну у меня в основном потоке красивая форма прогресса отрисовывается с анимацией, так что очереди тасков у меня не будет даже чисто теоретически. Так что проблемы с глобальными переменными быть не может.
Да и передавать через вариант скажем набор разнотипных объектов или переменных не так чтобы совсем уж логично. Хотя конечно это личное дело каждого.
На самом деле лвиная доля типовых тасков это типовые операции с датасетом, открытие например. Так что таск на открытие можно иметь один, просто передавать в него датасет который там уже и открывать попутно отрисовывая красивое окно ожидания.
...
Рейтинг: 0 / 0
Шаблон класса для работы с потоком (WThread, Thread)
    #39402642
Фотография wadman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
энди,
не понимаю. Предлагаешь урезать функционал под тебя?
Перепиши как хочешь, исходники полностью доступны. Уж извини, что тоже пользуюсь библиотекой и не ограничиваюсь только одним случаем.
И копирование файлов идет фоном в два потока, и непрерывная печать на упаковке, и формирование выгрузок в эксель и т.д.
...
Рейтинг: 0 / 0
Шаблон класса для работы с потоком (WThread, Thread)
    #39402757
энди
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
да не, я не претензии, все равно спасибо за либу, снимает головную боль
а так да, я уже кривенького наследника накропал под свои типы задач :)
...
Рейтинг: 0 / 0
Шаблон класса для работы с потоком (WThread, Thread)
    #39435554
Фотография Док
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
wadman,

иконки не было в комплекте или она потерялась?
...
Рейтинг: 0 / 0
Шаблон класса для работы с потоком (WThread, Thread)
    #39435624
Фотография wadman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Докиконки не было в комплекте или она потерялась?
Не было. На кой она? :)
...
Рейтинг: 0 / 0
Шаблон класса для работы с потоком (WThread, Thread)
    #39437678
Фотография wadman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Убрал StopThread (Terminate удобнее).
Добавил возможность стартовать поток 2 из потока 1 с обратной связью в поток 1 (а не VCL/LCL).
Тут нужно понимать, что используется механизм сообщений и обратная связь идет через очередь потока 1.
Убрал жуткую ошибку, которая тянулась с самого начала, но вылезла только на стресс-тесте в внезапным закрытием, когда потоки во всю "общаются".
Ну и исправления по мелочи...
...
Рейтинг: 0 / 0
Шаблон класса для работы с потоком (WThread, Thread)
    #39439066
sql2012
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
wadman,

из simpledemo -
В TaskDemoTimerExecute поменял с 1000 на 5000:
Код: pascal
1.
2.
   // hard work
   Sleep(5000);



При закрытии приложения - падает при вызове 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
---------------------------
...
Рейтинг: 0 / 0
Шаблон класса для работы с потоком (WThread, Thread)
    #39439078
Фотография wadman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
sql2012,

логично. Компонента то шлепнута.
Либо замени слип на работу с проверкой терминатора, либо увеличь интервал ожидания в finishalltasks в деструкторе формы.
...
Рейтинг: 0 / 0
Шаблон класса для работы с потоком (WThread, Thread)
    #39439082
sql2012
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
wadman,

Спасибо.
...
Рейтинг: 0 / 0
Шаблон класса для работы с потоком (WThread, Thread)
    #39485732
Фотография wadman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Залил на гитхаб: https://github.com/wadman/wthread/

Из последних изменений: поток для синхронного вызова vcl/lcl перевел в режим singleton.
Как раньше не догадался? При большом количестве потоков большой и не нужный расход памяти и дескрипторов.
Теперь таски по умолчанию принудительно прибиваются при Destroy, если не вызвать явно ожидание их работы (FinishAllTasks, WaitAllTasks). Раньше было наоборот.
...
Рейтинг: 0 / 0
Шаблон класса для работы с потоком (WThread, Thread)
    #39538557
Фотография wadman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Добавил TWEvent.WaitForMultiple, который, соответственно, работает только со своим классом.
Подходит для синхронизации нескольких потоков TWThread, TWCThread.
...
Рейтинг: 0 / 0
Шаблон класса для работы с потоком (WThread, Thread)
    #39538598
schi
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А можно для тормознутых и бестолковых пояснить, чем отличается от ThreadPool, QueueUserWorkItem, QueueUserAPC, etc ?
...
Рейтинг: 0 / 0
25 сообщений из 469, страница 16 из 19
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Шаблон класса для работы с потоком (WThread, Thread)
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]