Maks150988
Advanced Member | Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору Помогите разобраться с потоками. Ситуация такая: имеет процедуру/функцию, которую необходимо выполнить в отдельном потоке чтобы программа не висла. Но необходимо выполнить ее так, чтобы не в цикле что-то происходило, а единоразово все это выполнилось, но в потоке. Код урезанный и впринципе все что нужно есть. Принцип работы состоит в том что: запускается поток - в нем исполняется функция по загрузке и сохранению текстового файла на диск - чтение этого файла и дальнейший его парсинг - удаление файла после парсинга чтоб замести следы. Ненужное вырезано тут. Проблема заключаентся в том что если отсутсвует соединение с интрнетом, то функция остается висеть в потоке и якобы чего-то скачивается в текстовый файл и размер растет в арифметической прогрессии. Если без потока - все нормально. Как корректно запускать функцию в отдельном потоке единоразаово с дальнейшим завершением потока после завершения функции? Код: ///// Функция для выполнения в потоке function DownloadThread : Integer; begin Result := 0; // Начинаем загрузку файла с маршрутами if GetInetFile('http://ссылка', ExtractFilePath(ParamStr(0)) + DOWNLOADFILENAME) = FALSE then begin SendMessage(hDwn, WM_CLOSE, 0, 0); MessageBox(hApp, PChar('Не удалось загрузить файл'), PChar('Ошибка'), MB_ICONSTOP); end else begin Sleep(150); // Считываем значения маршрутов из файла LoadRoutesServer(GetDlgItem(hDwn, IDC_PBR_INFO), GetDlgItem(hApp, IDC_LVIEW_IP)); // Усыпляем программу чтобы е было так быстро все Sleep(150); // Закрываем наш диалог под конец SendMessage(hDwn, WM_CLOSE, 0, 0); end; end; ///// Кусок кода из функции диалога WM_INITDIALOG hThread := BeginThread(nil, 0, @DownloadThread, 0, 0, ThreadID); if hThread <> 0 then CloseHandle(hThread); | Нужно ли также уничтожать поток в WM_CLOSE? А то выскакивает ошибка и программа вылетает если использовалось TerminateThread с дескриптором трэда. Или если надо, то как позакрывать всякие финтиклюшки этого трэда корректно, чтоб уж на всякий случай завершить его при закрытии диалога. |