![]() |
|
Модераторы: Snowy, MetalFan, bems, Poseidon |
![]()
|
|
| Pcrepair |
|
|||
|
Бывалый ![]() Профиль Группа: Участник Сообщений: 209 Регистрация: 16.1.2011 Репутация: нет Всего: нет |
Добрый день. Есть программа многопоточной загрузки с обработкой HTML-странииц
Программа работает, но иногда попадаются файлы большого размера(10 мб, например http://www.techboard.ru/thread.php?cid=6&a...&page=2546) с большим количеством ссылок внутри. загрузчик (TidHttp) загружает страницу достаточно быстро(40 сек) и гарантированно, но обработка такой страницы доходит до 30 мин и завершается корректно, однако времени ждать такую страницу нет, желательно нажать на батон и завершить такой поток, но корректно Вопросы: - возможно ли это в принципе? с корректным освобождением ресурсов - если возможно, то как конкретно это сделать, желательно пример --------------------
Сборник рабочего кода Процедур и Функций DelPhi http://validcoderepo.narod.ru/ |
|||
|
||||
| Poseidon |
|
|||
![]() Delphi developer ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 5273 Регистрация: 4.2.2005 Где: Гомель, Беларусь Репутация: 9 Всего: 133 |
Вот просмотри пример. Там показан один из вариантов как можно "попросить" поток остановится нажатием кнопки.
-------------------- Если хочешь, что бы что-то работало - используй написанное, если хочешь что-то понять - пиши сам... |
|||
|
||||
| boobie |
|
|||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 162 Регистрация: 16.9.2011 Репутация: нет Всего: нет |
Корректное освобождение ресурсов, я думаю, это проблема уже программиста. |
|||
|
||||
| Poseidon |
|
|||
![]() Delphi developer ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 5273 Регистрация: 4.2.2005 Где: Гомель, Беларусь Репутация: 9 Всего: 133 |
-------------------- Если хочешь, что бы что-то работало - используй написанное, если хочешь что-то понять - пиши сам... |
|||
|
||||
| bems |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 3400 Регистрация: 5.1.2006 Репутация: 18 Всего: 88 |
для начала, я думаю, нужно сделать что-то с получасовым парсингом
-------------------- Обижено школьников: 8 |
|||
|
||||
| Akella |
|
|||
![]() Творец ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 18485 Регистрация: 14.5.2003 Где: Корусант Репутация: 8 Всего: 329 |
Начало отседава http://www.sql.ru/forum/actualutils.aspx?a...mp;msg=14392799
|
|||
|
||||
| MetalFan |
|
|||
![]() Аццкий Сотона ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 3815 Регистрация: 2.10.2006 Где: Moscow Репутация: 22 Всего: 128 |
Akella, имхо, чтобы ТС не путался в терминологии и уложил кашу по потокам в голове в порядок, надо в первую очередь изучить мегаопус Многопоточность - как это делается в Дельфи.
Это сообщение отредактировал(а) MetalFan - 18.6.2013, 10:14 -------------------- There are always someone smarter than you... |
|||
|
||||
| Akella |
|
|||
![]() Творец ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 18485 Регистрация: 14.5.2003 Где: Корусант Репутация: 8 Всего: 329 |
Да, долго его придётся изучать.
Но там нет одной важной фишки: в потоках лучше не использовать sleep(), а что вместо этого использовать? |
|||
|
||||
| MetalFan |
|
|||
![]() Аццкий Сотона ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 3815 Регистрация: 2.10.2006 Где: Moscow Репутация: 22 Всего: 128 |
Akella, почему? хотя какой смотря таймаут использовать... если sleep(1)/SleepEx(1, true) к примеру, то, имхо, ничего страшного... но лучше, конечно, использовать Wait-функции для ожидания внутри потока.
-------------------- There are always someone smarter than you... |
|||
|
||||
| Poseidon |
|
|||
![]() Delphi developer ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 5273 Регистрация: 4.2.2005 Где: Гомель, Беларусь Репутация: 9 Всего: 133 |
Я чего-то может недопонимаю, но расскажите мне ситуацию, в которой нужно использовать sleep в потоках -------------------- Если хочешь, что бы что-то работало - используй написанное, если хочешь что-то понять - пиши сам... |
|||
|
||||
| MetalFan |
|
|||
![]() Аццкий Сотона ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 3815 Регистрация: 2.10.2006 Где: Moscow Репутация: 22 Всего: 128 |
Poseidon, ну, к примеру, крутится поток в бесконченом цикле, ждет чего-то... чтобы проц не грузил, втыкаем sleep с небольшим таймаутом.
Но это явно показывает, что есть недочеты в алгоритме работы потока. -------------------- There are always someone smarter than you... |
|||
|
||||
| Akella |
|
|||
![]() Творец ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 18485 Регистрация: 14.5.2003 Где: Корусант Репутация: 8 Всего: 329 |
Представим, что программа раз в 45 минут выполняет некую операцию, например, сохранение данных в XML. Сама операция (процедура экспорта в XML) длиться 30 секунд.
Как корректно завершить нить, чтобы правильно освободились все ресурсы, объекты и т.д.? Если вызвать terminated у потока, то поток будет ждать пока закончится sleep только потом завершиться. Пользователь решил завершить работу программы. Нажал Выход.... и всё - программа зависла. Пользователю что, ждать пол часа пока отработает оставшееся время, указанное в sleep? Да, можно закрыть принудительно, но будет ли это правильно? Добавлено @ 16:28 Я переделал на EVENT и теперь всё чики-пики Добавлено @ 16:29 А если использовать sleep(45 минут), то нить тупо зависает на это время. Как ты дашь знать потоку что нужно завершиться ,если поток сейчас в глубоком sleep`е? |
|||
|
||||
| bems |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 3400 Регистрация: 5.1.2006 Репутация: 18 Всего: 88 |
-------------------- Обижено школьников: 8 |
|||
|
||||
| Poseidon |
|
|||
![]() Delphi developer ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 5273 Регистрация: 4.2.2005 Где: Гомель, Беларусь Репутация: 9 Всего: 133 |
Верно, это ошибка алгоритма работы. Но это не говорит о том, что все, хана, без sleep никак. Зачем крутить цикл в холостую? Правильнее будет запускать поток при возникновении "чего-то". Я вообще не понимаю использование sleep в программах. Единственное место где это более-менее оправдано, это работа с сетью. Но слипы более секунды тоже говорят об ошибках алгоритма. -------------------- Если хочешь, что бы что-то работало - используй написанное, если хочешь что-то понять - пиши сам... |
|||
|
||||
| MetalFan |
|
|||
![]() Аццкий Сотона ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 3815 Регистрация: 2.10.2006 Где: Moscow Репутация: 22 Всего: 128 |
полностью согласен. Вот и правильное решение. Event (а можно и его обертку SyncObjs.TEvent), можно и нужно использовать в качестве "флага" того, что потоку надо что-то сделать. А вместо sleep/suspend/resume/suspended юзать WaitForSingleObjectEx/TEvent.WaitFor SetEvent/ResetEvent И получится и потокобезопасно и архитектурно-правильное решение. Это сообщение отредактировал(а) MetalFan - 19.6.2013, 08:30 -------------------- 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. |