Этот баннер — требование Роскомнадзора для исполнения 152 ФЗ.
«На сайте осуществляется обработка файлов cookie, необходимых для работы сайта, а также для анализа использования сайта и улучшения предоставляемых сервисов с использованием метрической программы Яндекс.Метрика. Продолжая использовать сайт, вы даёте согласие с использованием данных технологий».
Политика конфиденциальности
|
|
|
Промежуточный класс при работе с потоками
|
|||
|---|---|---|---|
|
#18+
Доброго дня! Столкнулся со странным поведением класса TThread. Пишу в менеджер потоков. В процессе, чтобы не добавлять в каждый класс однообразные процедуры и переменные создал промежуточный класс: Код: 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. Далее создаю потоки: Код: pascal 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. В Create добавляю: Код: pascal 1. 2. 3. 4. 5. 6. 7. По окончании работы выскакивает сообщение о потерях (на картинке) Почему? До этого было только о потере 1 критической секции. В обычных классах я так делал неоднократно, всё вроде как нормально. Число потоков - где то около 80. Есть у меня подозрение, что если я все эти переменные возверну в наследники, проблема пропадет... Заранее благодарен. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.04.2021, 15:36 |
|
||
|
Промежуточный класс при работе с потоками
|
|||
|---|---|---|---|
|
#18+
Сейчас обратил внимание что в одном классе я создавал procedure SendThreadView поверх предка, этих потоков около 35 - больше всех. В других используется процедура предка. Ну и Uncnow этих тоже где-то настолько меньше. Код: pascal 1. 2. 3. 4. 5. 6. 7. 8. 9. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.04.2021, 15:42 |
|
||
|
Промежуточный класс при работе с потоками
|
|||
|---|---|---|---|
|
#18+
Уничтожение экземпляров где? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.04.2021, 15:46 |
|
||
|
Промежуточный класс при работе с потоками
|
|||
|---|---|---|---|
|
#18+
Barmaley57, Код: pascal 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.04.2021, 15:51 |
|
||
|
Промежуточный класс при работе с потоками
|
|||
|---|---|---|---|
|
#18+
BorodaOleg Barmaley57, Код: pascal 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. Проверки не нужны. И кстати, ты в курсе, что у TThread есть и хэндл, и ИД? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.04.2021, 16:16 |
|
||
|
Промежуточный класс при работе с потоками
|
|||
|---|---|---|---|
|
#18+
BorodaOleg Код: pascal 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. Код: pascal 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. Ну и вызвать TerminateThread - это как использовать гильотину вместо цитрамона BorodaOleg Код: pascal 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. А Suspend вам зачем? Чтобы был повод вызвать TerminateThread и потерять все переменные с управляемым временем жизни? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.04.2021, 17:31 |
|
||
|
Промежуточный класс при работе с потоками
|
|||
|---|---|---|---|
|
#18+
BorodaOleg, А в чём прикол объявлять деструктор в protected? О том, что Resume, Suspend и особено TerminateThread использовать не нужно никогда - уже сказали. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.04.2021, 19:18 |
|
||
|
Промежуточный класс при работе с потоками
|
|||
|---|---|---|---|
|
#18+
YuRock А в чём прикол объявлять деструктор в protected? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.04.2021, 19:19 |
|
||
|
Промежуточный класс при работе с потоками
|
|||
|---|---|---|---|
|
#18+
YuRock О том, что Resume, Suspend и особено TerminateThread YuRock YuRock А в чём прикол объявлять деструктор в protected? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.04.2021, 19:43 |
|
||
|
Промежуточный класс при работе с потоками
|
|||
|---|---|---|---|
|
#18+
_Vasilisk_ Resume можно _Vasilisk_ А в чем проблема? При компиляции был ворнинг. VMT благополучно переписалось. Проблем нет Работать будет, конечно, кроме варнинга проблем не будет. Но варнинг - тоже проблема, если они висят постоянно, тогда программист на все варнинги перестает обращать внимание. Так чтотлучше б уж компилятор ошибку выдал, я это имел ввиду. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.04.2021, 19:58 |
|
||
|
Промежуточный класс при работе с потоками
|
|||
|---|---|---|---|
|
#18+
Fr0sT-Brutal Проверки не нужны. И кстати, ты в курсе, что у TThread есть и хэндл, и ИД? Проект не мой, и уже натыкался на казусы, когда класс пришибается раньше, а потом еще и в дестрое. Что есть и хэндл, и ИД? - в курсе. Лог: Процесс инициализирован : CTaskExequtor:tp Pull8 10756 ThreadID: 844 Процесс инициализирован : CTaskExequtor:tp Pull9 10768 ThreadID: 3728 Процесс инициализирован : CThreadPull 10648 ThreadID: 3952 Процесс инициализирован : CTaskExequtor:abon Hand Pull0 10796 ThreadID: 2504 Процесс инициализирован : CThreadPull 10784 ThreadID: 3424 Процесс инициализирован : CL4Module Только какая между ними разница - не в курсе ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.04.2021, 09:14 |
|
||
|
Промежуточный класс при работе с потоками
|
|||
|---|---|---|---|
|
#18+
_Vasilisk_ Зачем? Вы видели код TThread? Ну и вызвать TerminateThread - это как использовать гильотину вместо цитрамона Иногда потоки вешались намертво - посоветовали такой способ, вроде помогло. _Vasilisk_ Лихо! Вначале убиваем объект, а потом в родителе к нему обращаемся. Тут просто накладка вышла, я уже решил этот промежуточный класс не использовать и прописал SenderClass в потомке. _Vasilisk_ А Suspend вам зачем? Чтобы был повод вызвать TerminateThread и потерять все переменные с управляемым временем жизни? Был он тут, я на него как-то и внимания не обращал ) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.04.2021, 09:38 |
|
||
|
Промежуточный класс при работе с потоками
|
|||
|---|---|---|---|
|
#18+
[quot YuRock#22311641] _Vasilisk_ Resume можно Это нужно, если после создания надо передать потоку всякие дополнительные данные. Чтобы не пихать все в конструктор ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.04.2021, 10:27 |
|
||
|
Промежуточный класс при работе с потоками
|
|||
|---|---|---|---|
|
#18+
BorodaOleg Иногда потоки вешались намертво - посоветовали такой способ, вроде помогло. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.04.2021, 10:57 |
|
||
|
Промежуточный класс при работе с потоками
|
|||
|---|---|---|---|
|
#18+
Fr0sT-Brutal Это нужно, если после создания надо передать потоку всякие дополнительные данные. Чтобы не пихать все в конструктор ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.04.2021, 12:32 |
|
||
|
Промежуточный класс при работе с потоками
|
|||
|---|---|---|---|
|
#18+
Fr0sT-Brutal, авторРазве что, если создавать Suspended. Такое редко нужно, для пулов всяких хитрых, экономящих копейки, и обычно только усложняет всё, сложно смысл этого объяснить Suspended создавать как раза таки удобно. Я чаще всего Suspended и создаю. Создали, набили поток данными, start, посчиталось/выполнилось, забрали результаты. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.04.2021, 12:47 |
|
||
|
Промежуточный класс при работе с потоками
|
|||
|---|---|---|---|
|
#18+
_Vasilisk_ BorodaOleg Иногда потоки вешались намертво - посоветовали такой способ, вроде помогло. Нифига не помогает. Если убираю эту строку программа намертво вешается на финише. Если пытаюсь использовать TerminateProcess - вешается мгновенно )) Если прописываю просто Terminate - висит Если убиваю Suspend в потомке - висим ( ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.04.2021, 13:31 |
|
||
|
Промежуточный класс при работе с потоками
|
|||
|---|---|---|---|
|
#18+
makhaon, Поток не запустится раньше, чем выполнится весь код в конструкторе (можно посмотреть код конструктора и AfterConstruction класса TThread). То есть вот как Fr0sT-Brutal написал, если данные передаются в конструкторе (а не потом ещё), то Suspend не нужен. Я раньше этого не знал и писал в конструкторе типа: Код: pascal 1. 2. 3. 4. 5. 6. 7. 8. Можно писать Код: pascal 1. 2. 3. 4. 5. 6. 7. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.04.2021, 13:46 |
|
||
|
Промежуточный класс при работе с потоками
|
|||
|---|---|---|---|
|
#18+
makhaon Suspended создавать как раза таки удобно. Я чаще всего Suspended и создаю. Создали, набили поток данными, start, посчиталось/выполнилось, забрали результаты. Это не мне, а Юрку, я как раз так тоже делаю (в предыдущем сообщении цитата съелась) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.04.2021, 13:48 |
|
||
|
Промежуточный класс при работе с потоками
|
|||
|---|---|---|---|
|
#18+
Fr0sT-Brutal в предыдущем сообщении цитата съелась ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.04.2021, 15:52 |
|
||
|
Промежуточный класс при работе с потоками
|
|||
|---|---|---|---|
|
#18+
BorodaOleg Если пытаюсь использовать TerminateProcess - вешается мгновенно BorodaOleg Если прописываю просто Terminate - висит Если убиваю Suspend в потомке - висим ( Выход прост - надо прекратить судорожные действия, в выполнить последовательно два шага: 1. Понять, что корректное завершение потока - есть ни что иное, как штатное завершение функции потока (в данном случае - это метод Execute). Завершить работу этой функции можно только двумя путями, и только изнутри неё: 1 - вызвав Exit, 2 - выполнив до самого конца (до самого end;) всю цепочку операторов этой функции. В вашем случае "зависает" потому, что цепочка операторов (это и есть - поток команд) до конца не выполнилась, а продолжает выполняться. 2. После осознания первого пункта, необходимо изменить функцию потока (Execute) таким образом, чтобы она завершалась тогда, когда вы хотите. Влиять на нее (на ее логику) можно, вызывая Terminate (он просто присваивает полю Terminated значение True, больше ничего не делает), но Terminate и так вызывается в деструкторе потока. Если же поток чего-то ждёт (каких-то событий) - то надо сделать так, чтобы перестал ждать (взвести эти события). Если после того, как поток перестал ждать события, он начинает что-то делать - тогда перед этим можно вручную Terminate, чтобы не начинать лишних действий, и сразу выйти. В общем, логика любая, но результат должен быть один - достижение последнего end процедуры Execute. Никакие TerminateThread и Suspend не помогут, забудь об этих методах навсегда, они только вредны. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.04.2021, 16:05 |
|
||
|
Промежуточный класс при работе с потоками
|
|||
|---|---|---|---|
|
#18+
s62, Передавать пачку данных в конструктор такое себе удовольствие. Если параметр 1-2, то еще ладно. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.04.2021, 21:44 |
|
||
|
|

start [/forum/topic.php?fid=58&msg=40064286&tid=2037386]: |
0ms |
get settings: |
11ms |
get forum list: |
15ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
175ms |
get topic data: |
10ms |
get forum data: |
2ms |
get page messages: |
51ms |
get tp. blocked users: |
1ms |
| others: | 271ms |
| total: | 544ms |

| 0 / 0 |
