|
|
|
waitFor в потоке
|
|||
|---|---|---|---|
|
#18+
Давно не кодил на Паскале, это все сын балуется. Подскажите, если из класса - наследника потока вызвать: Код: pascal 1. 2. 3. Этот поток заблокирует сам себя и не завершится (не произойдет события onTerminate)? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.02.2020, 21:49 |
|
||
|
waitFor в потоке
|
|||
|---|---|---|---|
|
#18+
VirtaOtec, для того что бы потоку завершится это всё не нужно, достаточно просто выйти из execute. ну и нельзя вызывать destroy в обычном коде. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.02.2020, 23:28 |
|
||
|
waitFor в потоке
|
|||
|---|---|---|---|
|
#18+
makhaon VirtaOtec, ну и нельзя вызывать destroy в обычном коде. В обычном-то с чего вдруг?.. Если вы уверены что ссылка на объект валидная. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.02.2020, 10:15 |
|
||
|
waitFor в потоке
|
|||
|---|---|---|---|
|
#18+
VirtaOtec Давно не кодил на Паскале, это все сын балуется. Подскажите, если из класса - наследника потока вызвать: Код: pascal 1. 2. 3. Этот поток заблокирует сам себя и не завершится (не произойдет события onTerminate)? 1) Если этот код вызывать из Execute, то получите дедлок. 2) В цепочке Terminate -> WaitFor - > Destroy первые два вызова лишние, достаточно только Destroy, так как деструктор потока и так внури себя дергает Terminate -> WaitFor. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.02.2020, 11:17 |
|
||
|
waitFor в потоке
|
|||
|---|---|---|---|
|
#18+
alekcvp, в документации явно указана рекомендация: Do not call Destroy directly. Call Free instead. http://docwiki.embarcadero.com/Libraries/Rio/en/System.TObject.Destroy валидность ссылки должен проверять Free. Чем меньше тут самодеятельности - тем меньше проблем и сейчас и в будущем с возможным переносом кода. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.02.2020, 14:40 |
|
||
|
waitFor в потоке
|
|||
|---|---|---|---|
|
#18+
Нужно закрыть программу после корректного завершения потока. Чтобы это сделать, использую событие onTerminate потока, в нем закрываю программу. Код: 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. Программа зависает при остановке потока. Зависание происходит в th.destroy() на стандартных "terminate() -> waitFor()" TThread. Непонятно еще и то, почему если вызов waitFor() для себя же приводит к блокировке потока и его зависанию, почему этот метод используется в стандартном коде деструктора. Объяснитесь, пожалуйста. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.02.2020, 21:53 |
|
||
|
waitFor в потоке
|
|||
|---|---|---|---|
|
#18+
VirtaOtec, В любом случае нельзя вызывать Destroy() объекта из события этого объекта, т.к. после этого события всё равно будет выполняться код объекта. Один из вариантов решения проблемы: Код: pascal 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.02.2020, 22:28 |
|
||
|
waitFor в потоке
|
|||
|---|---|---|---|
|
#18+
VirtaOtec Нужно закрыть программу после корректного завершения потока. Чтобы это сделать, использую событие onTerminate потока, в нем закрываю программу. Код: 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. Программа зависает при остановке потока. Зависание происходит в th.destroy() на стандартных "terminate() -> waitFor()" TThread. Непонятно еще и то, почему если вызов waitFor() для себя же приводит к блокировке потока и его зависанию, почему этот метод используется в стандартном коде деструктора. Объяснитесь, пожалуйста. Странно, что зависает. Вроде по замыслу разработчиков Delphi не должно. Видать, за Тейксерой и Пачекой нужно перепроверять. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.02.2020, 23:20 |
|
||
|
waitFor в потоке
|
|||
|---|---|---|---|
|
#18+
А почему конструктор вызван без параметров? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.02.2020, 23:22 |
|
||
|
waitFor в потоке
|
|||
|---|---|---|---|
|
#18+
DmSer Странно, что зависает. Вроде по замыслу разработчиков Delphi не должно. OnTerminate же в Synchronize вызывается, вот и получается дедлок. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.02.2020, 01:07 |
|
||
|
waitFor в потоке
|
|||
|---|---|---|---|
|
#18+
авторНаоборот, должно. OnTerminate же в Synchronize вызывается, вот и получается дедлок. Зависает из-за особенностей VCL, то есть, в программе без VCL этот код не приведет к зависанию? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.02.2020, 07:13 |
|
||
|
waitFor в потоке
|
|||
|---|---|---|---|
|
#18+
YuRock DmSer Странно, что зависает. Вроде по замыслу разработчиков Delphi не должно. OnTerminate же в Synchronize вызывается, вот и получается дедлок. Я не с потолка это взял, прочитал в трудах "великих", по-моему у Тейксейра С., Пачеко К. В какой-то из редакций. К сожалению на работе доступна другая редакция и там такой хрени нет. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.02.2020, 08:30 |
|
||
|
waitFor в потоке
|
|||
|---|---|---|---|
|
#18+
Нашёл: это в редакции по Delphi 5 (в русском варианте), стр. 453. Вот выдержка из параграфа "Завершение работы потока": Объект TThread также имеет событие OnTerminate, которое происходит при завершении работы потока. Допускается освобождение объекта TThread внутри обработчика этого события. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.02.2020, 08:35 |
|
||
|
waitFor в потоке
|
|||
|---|---|---|---|
|
#18+
DmSer, Это либо опечатка, либо маразм. Потому что после выполнения события мы вернёмся куда? В уничтоженный объект? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.02.2020, 09:52 |
|
||
|
waitFor в потоке
|
|||
|---|---|---|---|
|
#18+
alekcvp DmSer, Это либо опечатка, либо маразм. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.02.2020, 11:34 |
|
||
|
waitFor в потоке
|
|||
|---|---|---|---|
|
#18+
alekcvp, есть вариант с FreeOnTerminate, но он сам по себе не торт ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.02.2020, 11:41 |
|
||
|
waitFor в потоке
|
|||
|---|---|---|---|
|
#18+
alekcvp DmSer, Это либо опечатка, либо маразм. Потому что после выполнения события мы вернёмся куда? В уничтоженный объект? Видимо автору такой маразм и попался :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.02.2020, 11:47 |
|
||
|
waitFor в потоке
|
|||
|---|---|---|---|
|
#18+
alekcvp Это либо опечатка, либо маразм. Потому что после выполнения события мы вернёмся куда? В уничтоженный объект? А что такое "вернёмся в объект"? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.02.2020, 12:36 |
|
||
|
waitFor в потоке
|
|||
|---|---|---|---|
|
#18+
Код: 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. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.02.2020, 12:58 |
|
||
|
waitFor в потоке
|
|||
|---|---|---|---|
|
#18+
softwarer alekcvp Это либо опечатка, либо маразм. Потому что после выполнения события мы вернёмся куда? В уничтоженный объект? А что такое "вернёмся в объект"? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.02.2020, 16:00 |
|
||
|
waitFor в потоке
|
|||
|---|---|---|---|
|
#18+
Квейд, [:|||||||||:] ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.02.2020, 16:05 |
|
||
|
waitFor в потоке
|
|||
|---|---|---|---|
|
#18+
DmSer Нашёл: это в редакции по Delphi 5 Код: pascal 1. 2. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.02.2020, 18:28 |
|
||
|
waitFor в потоке
|
|||
|---|---|---|---|
|
#18+
softwarer alekcvp Это либо опечатка, либо маразм. Потому что после выполнения события мы вернёмся куда? В уничтоженный объект? А что такое "вернёмся в объект"? Имеется в виду очередь выполнения команд, я хз как это по-умному обозвать. То что делает ассемблерная команда ret. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.02.2020, 09:51 |
|
||
|
waitFor в потоке
|
|||
|---|---|---|---|
|
#18+
VirtaOtec авторНаоборот, должно. OnTerminate же в Synchronize вызывается, вот и получается дедлок. Зависает из-за особенностей VCL, то есть, в программе без VCL этот код не приведет к зависанию?Тем более, скорее всего приведет, т.к. обработка Synchronize происходит в VCL-ном цыкле обработки сообщений. Ну или самому надо будет CheckSynchronize вызывать. А лучше не мучиться, а перестать использовать Synchronize и всё что с ним связано (всякие TThread.OnTerminate и т.п.). Это всё просто не нужно, и только приводит к проблемам. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.02.2020, 14:53 |
|
||
|
waitFor в потоке
|
|||
|---|---|---|---|
|
#18+
YuRock, допустим, есть клиент-серверное приложение с отдельными потоками для обработки сокетов. Клиент/сервер время от времени генерирует событие, выводящее сообщение в лог, а внешнее приложение в ответ на это событие записывает сообщение в компонент TMemo. При закрытии приложения из-за несинхронного закрытия потоков событие лога возникает в тот момент, когда форма уже удалена, и переменная memo содержит nil, что приводит к ошибке. Соответственно, используем onTerminate потока, чтобы в его обработчике выйти из программы - в этом случае компоненты на форме будут существовать до самого окончания работы потока. Или это неправильный подход? Как здесь обойтись без onTerminate? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.02.2020, 20:01 |
|
||
|
|

start [/forum/topic.php?fid=58&msg=39928762&tid=2038538]: |
0ms |
get settings: |
10ms |
get forum list: |
18ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
69ms |
get topic data: |
12ms |
get forum data: |
3ms |
get page messages: |
79ms |
get tp. blocked users: |
2ms |
| others: | 249ms |
| total: | 450ms |

| 0 / 0 |
