| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > Delphi: Общие вопросы > Повторное использование потока |
| Автор: NewDima 7.5.2009, 16:22 |
| Наследую обычный TThread. В общем не важно, что пишу в execute. Один раз вызываю resume, и поток нормально отрабатывает, никаких поблем. Вызываю после отработки второй раз - в execute не попадаю. Что за дела, кто знает? |
| Автор: Демо 7.5.2009, 16:25 |
Вот это как понимать? После Resume th заканчивает свою работу? Добавлено через 34 секунды Приведи реализацию TThread. |
| Автор: NewDima 7.5.2009, 16:29 | ||
собственно там ерунду написал, быстро сообразил и отредактировал, потому как к делу отношения не имеет =)
Не хитро, правда? В общем по стандарту решил проверить, потому как заметил на своем другом потоке |
| Автор: NewDima 7.5.2009, 16:43 | ||
не понял, это с каких пор? я перекрываю виртуальный execute и ресумом перевожу поток в состояние готовности для шедуллера винды. Я так полагаю, под словом терминируется вы имели ввиду "освобождается"? ан нет, я не устанавливал FreeOnTerminate в true |
| Автор: kami 7.5.2009, 18:15 |
Не нужно путать виндовые потоки и класс-обертку TThread. Когда происходит выход из Execute TThread виндовый поток завершается. Винда про него забывает. Все - для нее этого потока больше не существует. А вот экземпляр класса остается. Но вот сделать он с потоком больше ничего не может. Потому что нет больше этого потока. Цирк уехал, а клоуны остались. В смысле - поток завершен и выброшен на свалку истории, а экземпляр TThread, его методы и свойства остаются доступными для вычисления последствий отработки потока. С самых обычных. Если в методе Execute есть только Synchronize, то само наличие дополнительного потока теряет смысл и только усложняет архитектуру приложения. Добавлено через 6 минут и 7 секунд +100 !!! |
| Автор: Демо 7.5.2009, 21:02 | ||||
Обещанный пример:
|
| Автор: NewDima 8.5.2009, 03:51 |
| Причем стандарты Фленова? Стандартный делфийский поток создаю, собственно в его каркас вставляю код. А то что в экзэкьюте используется только один метод, вызываемый Synchronize не значит, что я использую его вообще. Настоящий поток устроен совсем по-другому, а этот писал для проверки, дохнет ли виндовская нить при выходе из экзекьюта. Я полагал, что при выходе она впадает в состояние приостановки, в этом и ошибся. А по архитектуре приложения, то мне нужен класс, которому устанавливаешь задание и запускаешь, причем во время работы его можно было корректно приостановить (не саспендом в моем случае), а потом продолжить работу далее. А по выполнению задания он должен останавливаться. Это я реализовал, только проще, и только уже утром, когда проспался. Всем удачи PS кстати, о Фленове, даже не подозреваю, кто это, если пишет книги, то я ни одной книги не прочитал, только мсдн |
| Автор: Демо 8.5.2009, 10:03 | ||
Ну так поделился бы своим решением. |
| Автор: NewDima 8.5.2009, 10:56 | ||
|
| Автор: Демо 8.5.2009, 18:41 |
| NewDima, Не хочу сказать ничего плохого, но алгоритм крайне ненадёжен. Возможны одновременные успешные попытки выполнения TDownloadThread.Download. |
| Автор: MetalFan 8.5.2009, 22:08 |
| вообще не очень хорошо использовать suspend-resume... |
| Автор: NewDima 9.5.2009, 05:16 |
| MetalFan, хотелось бы увидеть аргументы, хотя я и сам так подумываю, но все-таки =) |
| Автор: Alexeis 9.5.2009, 12:06 |
suspend-resume заморозит поток в произвольном состоянии, это все равно что не останавливать. Получиться незавершенная операция и все вытекающие проблемы синхронизации и одновременного доступа к общей памяти. |
| Автор: NewDima 9.5.2009, 14:41 |
| дело в том, что suspend и resume вызываются только в самом классе, причем в соответствующих случаях закрываются(или открываются) нужные дескрипторы. Разве это не должный контроль ресурсов? Добавлено через 14 минут и 17 секунд Демо, ты имеешь ввиду, что два других потока попытаются выполнить этот метод? Если честно, не совсем понимаю, почему такое возможно |
| Автор: Alexeis 9.5.2009, 15:41 | ||
Как можно определить тот самый момент? Кроме того ничего не мешает вызывать методы наследника TThread из чужого потока и получить остановку в неопределенный момент. Определить нужный момент можно заставив поток ждать нужного момента, например на WaitForSingleObject/GetMessage/SendMessage и т.д. Раз уж мы смогли остановить поток в нужный момент, то зачем делать дополнительный suspend, ведь он и так спит ? |
| Автор: Демо 9.5.2009, 16:37 | ||||
|
| Автор: NewDima 9.5.2009, 16:54 |
| Спс, я подумаю |