Извините меня, я возможно уже достал всех, но с потоками всё таки работаю первый раз, так что сильно не ругать
Вопрос в следующем, использую один единственный поток (не основной) для загрузки файлов с сети с использованием Indy. Программа циклом проходит по строкам таблицы с ссылками и в потоке скачивает файлы из интернета. Запуск и остановку потока по нажатию кнопок я отработал, а вот корректную остановку потока по закрытию программы в случае закачки файла так и не могу сделать.
Для записи в файл использую TFileStream, соответственно выполняется процедура HTTP.Get(link,file), где переменная file как раз и является файловым потоком. Основная задача обеспечить докачку файлов с сервера, с этим я тоже справился с помощью указания Range компонента idHTTP. Проблема именно в остановке закачки при закрытии формы.
Остановка закачки, то есть выполнения потока происходит либо при окончании скачивания файла (либо диапазона, т.е докачки), т.е. выполнения процедуры Get, либо после установки булевой переменной в false, которая проверяется на событии OnWork компонента idHTTP. На закрытие приложения я добавил установку булевой переменной в false, как при остановке закачки, соответственно должна происходить отработка потока и уничтожение, а соответственно и всех его объектов (тот самы файловый поток), но этого не происходит, точнее поток не успевает отработать, соответсвенно не происходит освобождения файлового потока, и после закрытия программы файл, в который происходила закачка имеет размер файла источника, а не закачанной части. Т.е. получается не происходит уничтожения переменной file.
Так же есть косячок, который я до сих пор не могу понять. При создании потока устанавливаю FreeOnTerminate=true, соответственно поток должен при отработке процедуры Execute уничтожаться автоматически. После остановки закачки по нажатию кнопки в приложении, закачка останавливается, переменная file уничтожается (в конструкции finally в потоке), и файл приёмник имеет корректный размер, который мы успели закачать. Но при попытке проверки существования потока if Assigned(GetThread) программа показывает что потока существует, т.е. он не уничтожился, как и ожидалось.
У меня два вопроса:
1) как корректно убить поток, что бы произошло уничтожение фалового потока и сохранение именно закачанного объёма информации в файл? пока что у меня это не получается
2) почему при остановке потока не происходит его уничтожение? или я не правильно проверяю?