Delphi6

BANNED | Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Цитата: Thread.Suspend; Thread.Free; | это и есть то что я говорю нереально. Допустим у меня была в прошлом такая ситуация когда информация считывалась с носителя CD. Так вот если место где происходило считывание было повреждено, то даже по истечении времени команда suspend не работала, поток уничтожался только после того как истекало время считывания данных (системный таимаут) и генерировалась ошибка (ее конечно отлавливал), И что я имел в результате, 30 секунд ждал пока поток завершит работу. Когда функция TerminateThread убивает поток насмерть мгновенно! Вот только не знаю насколько качественно освобождается потом память при вызове команды thread.free, хотя думаю память должна освобождаться Думаю это легко проверить если запустить и уничтожить до 10.000 потоков. Цитата: Лучше сделать, так как сделали в одном сетевом сканере - создают ещё одно маленькое приложение и запускают несколько копий. Все проблемы быстро решаются | идейка хорошая, но как потом результат работы каждой программки получать? В файл кидать и потом считывать? но все это доп. ресурсы, учитывая что все на дельфи пишется, хотя если будет не визуальная программулька то думаю все будет ок. Мой вердикт, для моих целей слишком наворочена, да и так работает без проблем пока. Цитата: все ресурсы в рабочем потоке выделяй только как члены класса | вот именно, у меня "поток закачки" создается в "потоке проверки" таким образом если удаляется главный поток то и удаляется все в нем, хотя для доп. безопасности можно их оформить как члены класса. ("поток закачки" член "потоке проверки" класса) Цитата: то автоматического уничтожения объекта Thread у тебя не произойдет | для этой цели я на всякий случай после это команды вызываю thread.free что как я думаю должно освобождать память. Цитата: Это есть зло, он даже писал что надо делать синхронизацию а это оказалось самой большой ошибкой, читал на этот счет много статей в интернете Так что кто знает Цитата: достаточно и одного потока на всех | ок если вы внимательно прочтете алгоритм то заметите что есть вероятность что код закачки в "потоке закачки" может повиснуть, а именно закачка может длиться очень долго если скорость соединения очень мала, а как вы собираетесь после таимаута его убить? Только запустив в потоке и контролируя пройденное время снаружи. Зачем второй поток? А как вы собираетесь контролировать сразу несколько запушенных закачек? Не легче все это оформить в виде одного потока который сам будет следить за всем и через таимаут время выдаст результат или положительный или отрицательный. Сам проанализирует результаты работы "потока закачки". Вам же остается просто запустить 10 (к слову) "потоков проверки" и ждать когда же они все закончат работу (а они сто пудово закончат работу вовремя). Ну думаю один очень мудрый совет получил на счет того что "поток закачки" лучше оформить в виде члена класса "поток проверки". И что TerminateThread есть зло. Я согласен, даже читал один мануал в котором говорилось не о TermiateThread а что-то вроде SuspendThread который точно зло, так как в примере было показано как программу можно подвесить такой функцией случайно. Вопрос до сих пор актуален, как вы убиваете поток, в котором не просто бесконечный цикл (на него команда suspend) сработает, а компонент который работает с внешним миром, типа считывает данные с носителей, качает данные из инета, или проверяет содержимое другой программы или еще что. Добавлено: Цитата: Может пересмотреть механизм скачки? Например, в самом потоке сделать таймаут, или по таймауту закрывать сокет? Это будет (я так думаю) более удачным решением. В этом случае сам поток поймет, что надо закрываться и грамотно освободит свои ресурсы. | А как можно остановить закачку, допустим компонента TIdHTTP? Я думаю это не реально, хотя возможно есть способ, сейчас пробью в инете... Добавлено: Вот в соседнем форуме ведеться обсуждение и вот что один сказал Цитата: При работе с сокетами (сетью), к сожалению, нормального способа быстро уничтожить поток нет. Если сокет ждет подключения (ответа сервера), сервер не отвечает, поток можно будет убить только после возникновения таймаута. Многие известные программы (в том числе и от MS) уничтожают потоки аварийно, а потом как-то подчищают ресурсы. | http://delphimaster.ru/cgi-bin/forum.pl?id=1149041613&n=5 |