![]() |
|
Модераторы: Poseidon, Snowy, bems, MetalFan |
![]()
|
|
| NewDima |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 922 Регистрация: 20.2.2006 Где: <?here?> Репутация: 2 Всего: 12 |
Наследую обычный TThread. В общем не важно, что пишу в execute. Один раз вызываю resume, и поток нормально отрабатывает, никаких поблем. Вызываю после отработки второй раз - в execute не попадаю. Что за дела, кто знает?
Это сообщение отредактировал(а) NewDima - 7.5.2009, 16:25 |
|||
|
||||
| Демо |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1278 Регистрация: 3.11.2005 Репутация: 30 Всего: 50 |
Вот это как понимать? После Resume th заканчивает свою работу? Добавлено через 34 секунды Приведи реализацию TThread. -------------------- |
|||
|
||||
| NewDima |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 922 Регистрация: 20.2.2006 Где: <?here?> Репутация: 2 Всего: 12 |
собственно там ерунду написал, быстро сообразил и отредактировал, потому как к делу отношения не имеет =)
Не хитро, правда? В общем по стандарту решил проверить, потому как заметил на своем другом потоке |
|||
|
||||
| Демо |
|
||||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1278 Регистрация: 3.11.2005 Репутация: 30 Всего: 50 |
Категорически выбрось такие "Стандарты". Видимо, это стандарт Флёнова. Метод Execute выполняется в отдельном потоке(нити). После того, как этот метод закончился, дополнительный поток терминируется, и ни о каком повторном использовании речи быть не может.
Используя таким способом Synchronize, ты выполняешь TNewThread.sm в основном потоке. Сейчас нарисую пример для повторного использования потока. Это сообщение отредактировал(а) Демо - 7.5.2009, 16:36 -------------------- |
||||
|
|||||
| NewDima |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 922 Регистрация: 20.2.2006 Где: <?here?> Репутация: 2 Всего: 12 |
не понял, это с каких пор? я перекрываю виртуальный execute и ресумом перевожу поток в состояние готовности для шедуллера винды. Я так полагаю, под словом терминируется вы имели ввиду "освобождается"? ан нет, я не устанавливал FreeOnTerminate в true |
|||
|
||||
| kami |
|
|||
|
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1806 Регистрация: 25.8.2007 Где: Санкт-Петербург Репутация: 23 Всего: 72 |
Не нужно путать виндовые потоки и класс-обертку TThread. Когда происходит выход из Execute TThread виндовый поток завершается. Винда про него забывает. Все - для нее этого потока больше не существует. А вот экземпляр класса остается. Но вот сделать он с потоком больше ничего не может. Потому что нет больше этого потока. Цирк уехал, а клоуны остались. В смысле - поток завершен и выброшен на свалку истории, а экземпляр TThread, его методы и свойства остаются доступными для вычисления последствий отработки потока. С самых обычных. Если в методе Execute есть только Synchronize, то само наличие дополнительного потока теряет смысл и только усложняет архитектуру приложения. Добавлено через 6 минут и 7 секунд +100 !!! |
|||
|
||||
| Демо |
|
||||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1278 Регистрация: 3.11.2005 Репутация: 30 Всего: 50 |
Обещанный пример:
-------------------- |
||||
|
|||||
| NewDima |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 922 Регистрация: 20.2.2006 Где: <?here?> Репутация: 2 Всего: 12 |
Причем стандарты Фленова? Стандартный делфийский поток создаю, собственно в его каркас вставляю код. А то что в экзэкьюте используется только один метод, вызываемый Synchronize не значит, что я использую его вообще. Настоящий поток устроен совсем по-другому, а этот писал для проверки, дохнет ли виндовская нить при выходе из экзекьюта. Я полагал, что при выходе она впадает в состояние приостановки, в этом и ошибся.
А по архитектуре приложения, то мне нужен класс, которому устанавливаешь задание и запускаешь, причем во время работы его можно было корректно приостановить (не саспендом в моем случае), а потом продолжить работу далее. А по выполнению задания он должен останавливаться. Это я реализовал, только проще, и только уже утром, когда проспался. Всем удачи PS кстати, о Фленове, даже не подозреваю, кто это, если пишет книги, то я ни одной книги не прочитал, только мсдн Это сообщение отредактировал(а) NewDima - 8.5.2009, 03:51 |
|||
|
||||
| Демо |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1278 Регистрация: 3.11.2005 Репутация: 30 Всего: 50 |
Ну так поделился бы своим решением. -------------------- |
|||
|
||||
| NewDima |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 922 Регистрация: 20.2.2006 Где: <?here?> Репутация: 2 Всего: 12 |
|
|||
|
||||
| Демо |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1278 Регистрация: 3.11.2005 Репутация: 30 Всего: 50 |
NewDima,
Не хочу сказать ничего плохого, но алгоритм крайне ненадёжен. Возможны одновременные успешные попытки выполнения TDownloadThread.Download. -------------------- |
|||
|
||||
| MetalFan |
|
|||
![]() Аццкий Сотона ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 3815 Регистрация: 2.10.2006 Где: Moscow Репутация: 62 Всего: 128 |
вообще не очень хорошо использовать suspend-resume...
-------------------- There are always someone smarter than you... |
|||
|
||||
| NewDima |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 922 Регистрация: 20.2.2006 Где: <?here?> Репутация: 2 Всего: 12 |
MetalFan, хотелось бы увидеть аргументы, хотя я и сам так подумываю, но все-таки =)
|
|||
|
||||
| Alexeis |
|
|||
![]() Амеба Профиль Группа: Админ Сообщений: 11743 Регистрация: 12.10.2005 Где: Зеленоград Репутация: 109 Всего: 459 |
suspend-resume заморозит поток в произвольном состоянии, это все равно что не останавливать. Получиться незавершенная операция и все вытекающие проблемы синхронизации и одновременного доступа к общей памяти. -------------------- Vit вечная память. Обсуждение действий администрации форума производятся только в этом форуме гениальность идеи состоит в том, что ее невозможно придумать |
|||
|
||||
| NewDima |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 922 Регистрация: 20.2.2006 Где: <?here?> Репутация: 2 Всего: 12 |
дело в том, что suspend и resume вызываются только в самом классе, причем в соответствующих случаях закрываются(или открываются) нужные дескрипторы. Разве это не должный контроль ресурсов?
Добавлено через 14 минут и 17 секунд Демо, ты имеешь ввиду, что два других потока попытаются выполнить этот метод? Если честно, не совсем понимаю, почему такое возможно |
|||
|
||||
![]()
|
| Правила форума "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. |