Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Delphi Новый топик    Ответить
Топик располагается на нескольких страницах: Ctrl  назад   1 .. 10 11 12 13 14 15 [16] 17 18 19   вперед  Ctrl
 Re: Шаблон класса для работы с потоком (WThread, Thread)  [new]
wadman
Member

Откуда: Санкт-Петербург
Сообщений: 25056
энди,

поток на этом не останавливается.
Что мешает присвоить Param любое свое значение на выходе из OnExecute?
Этот же Param и будет в финише.
29 янв 17, 10:11    [20158168]     Ответить | Цитировать Сообщить модератору
 Re: Шаблон класса для работы с потоком (WThread, Thread)  [new]
энди
Member

Откуда: Киров, Россия
Сообщений: 938
Просто получается что для того чтобы поймать raise из потока мне надо перехватывать messages. А мне на самом деле сообщения из потока вообще не нужны, мне надо просто запустить и понять в конце выполнения потока были ошибки или нет, вот и все.
29 янв 17, 14:24    [20158507]     Ответить | Цитировать Сообщить модератору
 Re: Шаблон класса для работы с потоком (WThread, Thread)  [new]
wadman
Member

Откуда: Санкт-Петербург
Сообщений: 25056
энди
А мне на самом деле сообщения из потока вообще не нужны, мне надо просто запустить и понять в конце выполнения потока были ошибки или нет, вот и все.

Как ты хочешь это понять, если обратную связь не хочешь получать?
Попробуй из наследника TThread поймай exception. :)
+
Хинт: он молча схлопнется.


П.С. Ты кажется не понял концепцию моего потока: он работает (или спит) до конца работы приложения. Таск - это не поток, это сообщение для потока. Если хочешь обратную связь от таска (сообщения), придется потрудиться написать еще один обработчик. Иначе никак.
29 янв 17, 18:13    [20158913]     Ответить | Цитировать Сообщить модератору
 Re: Шаблон класса для работы с потоком (WThread, Thread)  [new]
makhaon
Member

Откуда: A galaxy far far away
Сообщений: 3061
wadman,

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


Я ловлю их и перезапускаю рухнувшие потоки.
29 янв 17, 21:35    [20159414]     Ответить | Цитировать Сообщить модератору
 Re: Шаблон класса для работы с потоком (WThread, Thread)  [new]
wadman
Member

Откуда: Санкт-Петербург
Сообщений: 25056
makhaon
wadman,

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


Я ловлю их и перезапускаю рухнувшие потоки.

Каким образом ловишь?
29 янв 17, 21:55    [20159474]     Ответить | Цитировать Сообщить модератору
 Re: Шаблон класса для работы с потоком (WThread, Thread)  [new]
makhaon
Member

Откуда: A galaxy far far away
Сообщений: 3061
wadman,

Обрабатываю OnTerminate, в нём при существовании FatalException считается, что поток упал. Создаю новый инстанс, присваиваю ссылку на поток ему. Стоит счетчик перезапусков, если он достиг порога - то считается, что поток умер фатально и перезапустить его автоматически не представляется возможным. Так обрабатываются несколько критичных потоков. Работает нормально.
Сервера, работающие 365/7/24.
29 янв 17, 22:46    [20159591]     Ответить | Цитировать Сообщить модератору
 Re: Шаблон класса для работы с потоком (WThread, Thread)  [new]
энди
Member

Откуда: Киров, Россия
Сообщений: 938
Но ведь посути ты возвращаешь мне информацию 2 способами, через messages и через finish таска, так почему надо возвращать информацию об ошибке внутри таска именно через messages, а не через finish?
30 янв 17, 00:37    [20159745]     Ответить | Цитировать Сообщить модератору
 Re: Шаблон класса для работы с потоком (WThread, Thread)  [new]
wadman
Member

Откуда: Санкт-Петербург
Сообщений: 25056
энди
так почему надо возвращать информацию об ошибке внутри таска именно через messages, а не через finish?

Дак что тебе мешает получить информацию через finish?
TTaskFinish     = procedure(const Sender: TTask; const Msg: Word; const Param: Variant) of object;

В Param в OnExecute ты можешь присвоить что угодно на выходе и оно в финише передастся.
30 янв 17, 09:17    [20160040]     Ответить | Цитировать Сообщить модератору
 Re: Шаблон класса для работы с потоком (WThread, Thread)  [new]
wadman
Member

Откуда: Санкт-Петербург
Сообщений: 25056
makhaon
Так обрабатываются несколько критичных потоков.

Интересный подход, но не лучше-ли если не писать не падающий код, то хотя-бы не убивать и запускать поток лишний раз?
30 янв 17, 09:18    [20160042]     Ответить | Цитировать Сообщить модератору
 Re: Шаблон класса для работы с потоком (WThread, Thread)  [new]
энди
Member

Откуда: Киров, Россия
Сообщений: 938
Не падающий код это утопия :)
30 янв 17, 10:00    [20160157]     Ответить | Цитировать Сообщить модератору
 Re: Шаблон класса для работы с потоком (WThread, Thread)  [new]
makhaon
Member

Откуда: A galaxy far far away
Сообщений: 3061
wadman,

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

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

Я поток не убиваю. Если в execute случается необработанное исключение - то поток заканчивается и убивается сам. Можно, конечно, все исключения ловить и не выпускать 'за' execute, но это плохой подход. В случае, например, AV это почти гарантированно закончится фатально для всего сервиса. Перезапуск потока же часто спасает ситуацию.
30 янв 17, 12:17    [20160849]     Ответить | Цитировать Сообщить модератору
 Re: Шаблон класса для работы с потоком (WThread, Thread)  [new]
энди
Member

Откуда: Киров, Россия
Сообщений: 938
Посидел повертел тут таски на реальных задачах и понял что меня смущает.
1) word передаваемый в start потока, зачем? если еще один доп параметр то за ним вроде как вариант идет и можно там его гонять если очень хочется что-то в таск передать.
2) variant в качестве входного параметра не сказать чтобы очень удобен, я привык параметры гонять с помощью коллекций и обычно пользую тупо TParams из db.pas. Он позволяет иметь кучу типов параметров, читаем и пишем как хотим без всякой сериализации/десериализации в Variant
3) Зачем вообще все эти входные параметры если можно иметь банальный набор значений в той же форме и зачитать их уже в самом таске. Вопрос многопоточности в этом случае не стоит так как таски выполняются последовательно.
4) Идеальным вариантом параметра для start выглядит имя процедуры которую таск уже запускает внутри себя в отдельном потоке. Тогда не надо на каждый чих заводить отдельный таск.
10 фев 17, 19:53    [20201804]     Ответить | Цитировать Сообщить модератору
 Re: Шаблон класса для работы с потоком (WThread, Thread)  [new]
wadman
Member

Откуда: Санкт-Петербург
Сообщений: 25056
энди
1) word передаваемый в start потока, зачем?

Можешь не использовать. Там три варианта Start, один из них без параметров.
энди
2) variant в качестве входного параметра не сказать чтобы очень удобен, я привык параметры гонять с помощью коллекций и обычно пользую тупо TParams из db.pas. Он позволяет иметь кучу типов параметров, читаем и пишем как хотим без всякой сериализации/десериализации в Variant

В варианте можно передать и массив. И массив массивов. И т.д. :)
энди
3) Зачем вообще все эти входные параметры если можно иметь банальный набор значений в той же форме и зачитать их уже в самом таске. Вопрос многопоточности в этом случае не стоит так как таски выполняются последовательно.

Они выполняются относительно доп.потока последовательно, но для основного потока они выполняются параллельно.
Задача на смекалку:
form1.SomeValue := 1;
Task1.Start; // выполняется минуту
form1.SomeValue := 2;
Task1.Start; // выполняется минуту
form1.SomeValue := 3;
Task1.Start; // тоже минуту

Какое значение будет в SomeValue, когда запустится таск первый и второй раз?
+ подсказка, не подглядывай

Для первого раза там в 99% случаев будет уже 3, для второго будет 3 уже 100%

энди
4) Идеальным вариантом параметра для start выглядит имя процедуры которую таск уже запускает внутри себя в отдельном потоке. Тогда не надо на каждый чих заводить отдельный таск.

Этот вариант уже сделан. В обработчике OnExecute, который и является процедурой.
11 фев 17, 10:47    [20202668]     Ответить | Цитировать Сообщить модератору
 Re: Шаблон класса для работы с потоком (WThread, Thread)  [new]
энди
Member

Откуда: Киров, Россия
Сообщений: 938
Ну у меня в основном потоке красивая форма прогресса отрисовывается с анимацией, так что очереди тасков у меня не будет даже чисто теоретически. Так что проблемы с глобальными переменными быть не может.
Да и передавать через вариант скажем набор разнотипных объектов или переменных не так чтобы совсем уж логично. Хотя конечно это личное дело каждого.
На самом деле лвиная доля типовых тасков это типовые операции с датасетом, открытие например. Так что таск на открытие можно иметь один, просто передавать в него датасет который там уже и открывать попутно отрисовывая красивое окно ожидания.
11 фев 17, 12:30    [20202883]     Ответить | Цитировать Сообщить модератору
 Re: Шаблон класса для работы с потоком (WThread, Thread)  [new]
wadman
Member

Откуда: Санкт-Петербург
Сообщений: 25056
энди,
не понимаю. Предлагаешь урезать функционал под тебя?
Перепиши как хочешь, исходники полностью доступны. Уж извини, что тоже пользуюсь библиотекой и не ограничиваюсь только одним случаем.
И копирование файлов идет фоном в два потока, и непрерывная печать на упаковке, и формирование выгрузок в эксель и т.д.
11 фев 17, 13:23    [20202975]     Ответить | Цитировать Сообщить модератору
 Re: Шаблон класса для работы с потоком (WThread, Thread)  [new]
энди
Member

Откуда: Киров, Россия
Сообщений: 938
да не, я не претензии, все равно спасибо за либу, снимает головную боль
а так да, я уже кривенького наследника накропал под свои типы задач :)
11 фев 17, 19:12    [20203495]     Ответить | Цитировать Сообщить модератору
 Re: Шаблон класса для работы с потоком (WThread, Thread)  [new]
Док
Member

Откуда: Казань
Сообщений: 6058
wadman,

иконки не было в комплекте или она потерялась?

К сообщению приложен файл. Размер - 10Kb
9 апр 17, 22:18    [20383143]     Ответить | Цитировать Сообщить модератору
 Re: Шаблон класса для работы с потоком (WThread, Thread)  [new]
wadman
Member

Откуда: Санкт-Петербург
Сообщений: 25056
Док
иконки не было в комплекте или она потерялась?

Не было. На кой она? :)
10 апр 17, 09:07    [20383616]     Ответить | Цитировать Сообщить модератору
 Re: Шаблон класса для работы с потоком (WThread, Thread)  [new]
wadman
Member

Откуда: Санкт-Петербург
Сообщений: 25056
Убрал StopThread (Terminate удобнее).
Добавил возможность стартовать поток 2 из потока 1 с обратной связью в поток 1 (а не VCL/LCL).
Тут нужно понимать, что используется механизм сообщений и обратная связь идет через очередь потока 1.
Убрал жуткую ошибку, которая тянулась с самого начала, но вылезла только на стресс-тесте в внезапным закрытием, когда потоки во всю "общаются".
Ну и исправления по мелочи...

К сообщению приложен файл (wthread.zip - 120Kb) cкачать
13 апр 17, 08:46    [20396796]     Ответить | Цитировать Сообщить модератору
 Re: Шаблон класса для работы с потоком (WThread, Thread)  [new]
sql2012
Member

Откуда: РФ
Сообщений: 657
wadman,

из simpledemo -
В TaskDemoTimerExecute поменял с 1000 на 5000:
   // 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
---------------------------


К сообщению приложен файл (01.zip - 2Kb) cкачать
15 апр 17, 10:07    [20404148]     Ответить | Цитировать Сообщить модератору
 Re: Шаблон класса для работы с потоком (WThread, Thread)  [new]
wadman
Member

Откуда: Санкт-Петербург
Сообщений: 25056
sql2012,

логично. Компонента то шлепнута.
Либо замени слип на работу с проверкой терминатора, либо увеличь интервал ожидания в finishalltasks в деструкторе формы.
15 апр 17, 11:04    [20404198]     Ответить | Цитировать Сообщить модератору
 Re: Шаблон класса для работы с потоком (WThread, Thread)  [new]
sql2012
Member

Откуда: РФ
Сообщений: 657
wadman,

Спасибо.
15 апр 17, 11:23    [20404222]     Ответить | Цитировать Сообщить модератору
 Re: Шаблон класса для работы с потоком (WThread, Thread)  [new]
wadman
Member

Откуда: Санкт-Петербург
Сообщений: 25056
Залил на гитхаб: https://github.com/wadman/wthread/

Из последних изменений: поток для синхронного вызова vcl/lcl перевел в режим singleton.
Как раньше не догадался? При большом количестве потоков большой и не нужный расход памяти и дескрипторов.
Теперь таски по умолчанию принудительно прибиваются при Destroy, если не вызвать явно ожидание их работы (FinishAllTasks, WaitAllTasks). Раньше было наоборот.
10 июл 17, 13:28    [20629090]     Ответить | Цитировать Сообщить модератору
 Re: Шаблон класса для работы с потоком (WThread, Thread)  [new]
wadman
Member

Откуда: Санкт-Петербург
Сообщений: 25056
Добавил TWEvent.WaitForMultiple, который, соответственно, работает только со своим классом.
Подходит для синхронизации нескольких потоков TWThread, TWCThread.
19 окт 17, 11:17    [20881622]     Ответить | Цитировать Сообщить модератору
 Re: Шаблон класса для работы с потоком (WThread, Thread)  [new]
schi
Member

Откуда: Москва
Сообщений: 2601
А можно для тормознутых и бестолковых пояснить, чем отличается от ThreadPool, QueueUserWorkItem, QueueUserAPC, etc ?
19 окт 17, 12:04    [20881884]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: Ctrl  назад   1 .. 10 11 12 13 14 15 [16] 17 18 19   вперед  Ctrl
Все форумы / Delphi Ответить