| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > Delphi: Общие вопросы > TThread.Queue для старых версий delphi |
| Автор: Чучмек 8.9.2013, 19:38 | ||
| Вчера стала задача - выполнить определенное действие (процедура завершения) гарантированно после отработки потока. Причем инициализация этого действия должна осуществляться из самого потока. Посмотрев список методов TThread сразу нашел Queue. Как Synchronize, только асинхронно. Все ок, только вот когда потребовалось скомпилить в D7 (требование заказчика), то случилось вполне ожидаемое - нет в D7 у потоков такого метода. Вот слепил на скорую руку заглушку. Может кому пригодится.
Добавляем в uses после classes и все. |
| Автор: Чучмек 8.9.2013, 22:03 | ||||
В том и дело, что OnTerminate вызывается через Synchronize.
А в вызываемом методе, в моем случае, стоит WaitFor.
Мой случай - две кнопки. Одна создает поток, другая завершает. Плюс у кнопок соответственно меняется enabled. Но поток может завершится и "сам" - по ошибке. При "самостоятельном" завершении должен выполнится обработчик кнопки "стоп". Как-то так. Знаю. Можно было бы извернутся десятью другими способами. |
| Автор: Poseidon 8.9.2013, 22:20 |
| Это верно, но это не имеет значения (в большинстве случаев) если речь идет о вызове после отработки потока. Вот при этому условии уже другой разговор. Тут явно нужна асинхронизация. Но если в этом твоем методе убрать WaitFor и засунуть его (метод) в OnTerminate, то, думаю, результат будет тот же. Я не в коем случае не хочу раскритиковать твой код и сказать что это лажа. Код хороший. Другое дело в том, что ты наткнулся на проблему отсутствия в старом Delphi метода, которого там нет и (самое главное) без которого можно было бы вообще обойтись. Т.е. получилось так, что сам себе придумал сложность и попытался ее решить. Да, это похвально. Но правильнее было бы не натыкаться на такую сложность. Другими словами, ты показал общественности как можно решить вопрос отсутствия метода Queue в D7, я же хочу указать лишь на то, что конкретно в твоем случае нет особой нужды использовать этот метод. (Если честно, я вообще не понимаю смысла вызывать при завершении потока метод, который вызывает WaitFor этого потока. Используй OnTerminate, он гарантированно вызовется только при завершении потока. И не нужно ничего ждать вэйтвором). В другом же случае, где использование Queue было бы действительно оправдано, твой код может кому-то и пригодиться. |
| Автор: MetalFan 10.9.2013, 12:51 | ||
полностью согласен. Не вижу смысла в пляске с бубном вокруг реализации Queue для D7 для данного случая. |