![]() |
Модераторы: Poseidon, Snowy, bems, MetalFan |
![]() ![]() ![]() |
|
Чучмек |
|
|||
НЭТ БИЛЭТ ![]() ![]() Профиль Группа: Участник Сообщений: 841 Регистрация: 11.5.2008 Где: СССР Репутация: 14 Всего: 41 |
Вчера стала задача - выполнить определенное действие (процедура завершения) гарантированно после отработки потока.
Причем инициализация этого действия должна осуществляться из самого потока. Посмотрев список методов TThread сразу нашел Queue. Как Synchronize, только асинхронно. Все ок, только вот когда потребовалось скомпилить в D7 (требование заказчика), то случилось вполне ожидаемое - нет в D7 у потоков такого метода. Вот слепил на скорую руку заглушку. Может кому пригодится.
Добавляем в uses после classes и все. Это сообщение отредактировал(а) Чучмек - 8.9.2013, 19:55 -------------------- умную мысль держи при себе, а дурной - поделись с другими |
|||
|
||||
Poseidon |
|
|||
![]() Delphi developer ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 5273 Регистрация: 4.2.2005 Где: Гомель, Беларусь Репутация: 53 Всего: 133 |
Это сообщение отредактировал(а) Poseidon - 8.9.2013, 20:27 -------------------- Если хочешь, что бы что-то работало - используй написанное, если хочешь что-то понять - пиши сам... |
|||
|
||||
Чучмек |
|
||||
НЭТ БИЛЭТ ![]() ![]() Профиль Группа: Участник Сообщений: 841 Регистрация: 11.5.2008 Где: СССР Репутация: 14 Всего: 41 |
В том и дело, что OnTerminate вызывается через Synchronize.
А в вызываемом методе, в моем случае, стоит WaitFor.
Мой случай - две кнопки. Одна создает поток, другая завершает. Плюс у кнопок соответственно меняется enabled. Но поток может завершится и "сам" - по ошибке. При "самостоятельном" завершении должен выполнится обработчик кнопки "стоп". Как-то так. Знаю. Можно было бы извернутся десятью другими способами. -------------------- умную мысль держи при себе, а дурной - поделись с другими |
||||
|
|||||
Poseidon |
|
|||
![]() Delphi developer ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 5273 Регистрация: 4.2.2005 Где: Гомель, Беларусь Репутация: 53 Всего: 133 |
Это верно, но это не имеет значения (в большинстве случаев) если речь идет о вызове после отработки потока.
Вот при этому условии уже другой разговор. Тут явно нужна асинхронизация. Но если в этом твоем методе убрать WaitFor и засунуть его (метод) в OnTerminate, то, думаю, результат будет тот же. Я не в коем случае не хочу раскритиковать твой код и сказать что это лажа. Код хороший. Другое дело в том, что ты наткнулся на проблему отсутствия в старом Delphi метода, которого там нет и (самое главное) без которого можно было бы вообще обойтись. Т.е. получилось так, что сам себе придумал сложность и попытался ее решить. Да, это похвально. Но правильнее было бы не натыкаться на такую сложность. Другими словами, ты показал общественности как можно решить вопрос отсутствия метода Queue в D7, я же хочу указать лишь на то, что конкретно в твоем случае нет особой нужды использовать этот метод. (Если честно, я вообще не понимаю смысла вызывать при завершении потока метод, который вызывает WaitFor этого потока. Используй OnTerminate, он гарантированно вызовется только при завершении потока. И не нужно ничего ждать вэйтвором). В другом же случае, где использование Queue было бы действительно оправдано, твой код может кому-то и пригодиться. ![]() -------------------- Если хочешь, что бы что-то работало - используй написанное, если хочешь что-то понять - пиши сам... |
|||
|
||||
MetalFan |
|
|||
![]() Аццкий Сотона ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 3815 Регистрация: 2.10.2006 Где: Moscow Репутация: 62 Всего: 128 |
полностью согласен. Не вижу смысла в пляске с бубном вокруг реализации Queue для D7 для данного случая. -------------------- There are always someone smarter than you... |
|||
|
||||
![]() ![]() ![]() |
Правила форума "Delphi: Общие вопросы" | |
|
Запрещается! 1. Публиковать ссылки на вскрытые компоненты 2. Обсуждать взлом компонентов и делиться вскрытыми компонентами
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader. |
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | Delphi: Общие вопросы | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |