Форум программистов, компьютерный форум, киберфорум
C++ Builder: FireMonkey
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.54/13: Рейтинг темы: голосов - 13, средняя оценка - 4.54
5 / 5 / 0
Регистрация: 27.09.2015
Сообщений: 106

Как принудительно завершить поток скачивания

08.12.2016, 14:28. Показов 2565. Ответов 16
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Пишу утилиту по скачиванию файлов. Нужно, чтобы по нажатию кнопки Pause закачка прекращалась, без выхода из программы (часть с дозакачкой уже мной написана). Как принудительно завершить поток, созданный функцией CreateThread? На данный момент, я могу остановить процесс, но файл, находящийся в процессе скачивания, так и продолжает качаться до конца.
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
08.12.2016, 14:28
Ответы с готовыми решениями:

Как правильно завершить поток
Всем привет. Что я делаю не так ? Поток запускается и работает хорошо, но вот при завершении программы она не закрывается, а зависает. Как...

Правильно завершить поток
Здравствуйте!!! Делаю программу через поток. Вот код #include <vcl.h> #pragma hdrstop #include "UTime1.h" ...

Завершить поток через 60 секунд
Здравствуйте, подскажите как завершить поток через 60 секунд ? Поток создаю так: DWORD WINAPI TestThread(LPVOID lpParameter) { ...

16
 Аватар для Dinkin
783 / 556 / 136
Регистрация: 31.05.2013
Сообщений: 3,142
Записей в блоге: 3
08.12.2016, 14:42
А стандарт, не работает ?
C++
1
Thr->Terminate();
0
5 / 5 / 0
Регистрация: 27.09.2015
Сообщений: 106
09.12.2016, 11:35  [ТС]
Дело в том, что для создания потока я использую функцию CreateThread, а не компонент TThread
0
 Аватар для Dinkin
783 / 556 / 136
Регистрация: 31.05.2013
Сообщений: 3,142
Записей в блоге: 3
09.12.2016, 11:41
ну в теле потока укажите типа так
C++
1
2
if(что то что определяет его завершение)
 Terminate();
0
5 / 5 / 0
Регистрация: 27.09.2015
Сообщений: 106
09.12.2016, 22:49  [ТС]
Поток создается так: Thread=CreateThread(NULL,0,ThreadFun,&Th readData, 0, 0);
Принудительно он завершается так: TerminateThread(Thread,0);
Это приводит к зависанию программы. В принципе в хелпе и не советуют использовать данный способ из-за непредсказуемости поведения. Нужно что-то другое.
0
 Аватар для Dinkin
783 / 556 / 136
Регистрация: 31.05.2013
Сообщений: 3,142
Записей в блоге: 3
09.12.2016, 23:01
Вы завершите поток не из вне ,а из тела потока (как Вам посоветовали, это самый безопасный и верный способ завершения), и не важно как вы его создали.
0
5 / 5 / 0
Регистрация: 27.09.2015
Сообщений: 106
10.12.2016, 10:15  [ТС]
Вы завершите поток не из вне ,а из тела потока
Внутри потока я могу его завершить только после завершения текущего скачивания, но клиент будет качать большие файлы, в итоге такой способ не удобен.
0
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
 Аватар для volvo
33195 / 21491 / 8233
Регистрация: 22.10.2011
Сообщений: 36,878
Записей в блоге: 12
10.12.2016, 10:25
Каким способом осуществляется скачивание?
0
5 / 5 / 0
Регистрация: 27.09.2015
Сообщений: 106
10.12.2016, 11:27  [ТС]
А можно ли как-то прервать работу функции get компонента IdHTTP?

Добавлено через 5 минут
Каким способом осуществляется скачивание?
IdHTTP1->Get(URL_DOWNLOAD,FILE_STREAM);
0
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
 Аватар для volvo
33195 / 21491 / 8233
Регистрация: 22.10.2011
Сообщений: 36,878
Записей в блоге: 12
10.12.2016, 12:52
C++
1
IdHTTP1->Disconnect();
, но ты потеряешь информацию о том, что (сколько данных) уже было скачано.
0
Эксперт С++
 Аватар для Avazart
8484 / 6151 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
10.12.2016, 16:55
Нужно использовать TThread, прерывать в обработчике OnWork можно кидать исключение, можно делать IdHTTP1->Disconnect(); и опять же ловить исключение.

Использовать CreateThread не получится.

Добавлено через 6 минут
Если схематично то так:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
class TerminateException: public  Exception
{
// ...
};
//--------------------------------------------------------------------------
void __fastcall TThread::Excecute()
{
       FIdHTTP->OnWork= &IdHTTPWork; 
 
       //
       try
      {
           FIdHTTP->Get(FUrl); 
      }
      catch(const TerminateException& E)
      {
       //
      }
}
//----------------------------------------------------------------------------
void __fastcall TThread::IdHTTPWork(TObject *ASender,
       TWorkMode AWorkMode,
         __int64 AWorkCount)
 
{
    if(Terminated)
         throw TerminateException("Прервано пользователем!");
}
C++
1
Thread->Terminate();
0
5 / 5 / 0
Регистрация: 27.09.2015
Сообщений: 106
10.12.2016, 19:17  [ТС]
Сработала идея с OnWork. В обработчике этого события поставил IdHTTP1->Disconnect(), пока вроде работает

Всем спасибо!
0
Эксперт С++
 Аватар для Avazart
8484 / 6151 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
10.12.2016, 19:25
Да только исключение(EIdException) все равно лучше отловить ибо IdHTTP1->Disconnect() скорее вызовет исключение.
0
5 / 5 / 0
Регистрация: 27.09.2015
Сообщений: 106
11.12.2016, 17:35  [ТС]
Новая незадача. Напомню, поток у меня создается так: Thread=CreateThread(NULL,0,ThreadFun,&Th readData, 0, 0);
И я хочу обеспечить совместимость с Маком. Но оказывается функция CreateThread не идет под Мак, билдер на нее ругается. Куда копать?)
0
Эксперт С++
 Аватар для Avazart
8484 / 6151 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
11.12.2016, 17:43
Цитата Сообщение от giveaway Посмотреть сообщение
Куда копать?)
Учится читать что пишут тебе в теме внимательно.
0
5 / 5 / 0
Регистрация: 27.09.2015
Сообщений: 106
11.12.2016, 17:49  [ТС]
Цитата Сообщение от Avazart Посмотреть сообщение
Учится читать что пишут тебе в теме внимательно.
Разве затрагивался вопрос кроссплатформенности?)) Можно поподробнее?
0
Эксперт С++
 Аватар для Avazart
8484 / 6151 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
11.12.2016, 17:51
Цитата Сообщение от Avazart Посмотреть сообщение
Нужно использовать TThread,
...
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
11.12.2016, 17:51
Помогаю со студенческими работами здесь

Как в С++ Builder из 2х потоков рисовать на форме квадратики(это первый поток рисует) и кружочки (2ой поток))
Помогите пожалуйсмта))))) Как в С++ Builder из 2х потоков рисовать на форме квадратики(это первый поток рисует) и кружочки (2ой поток))

Как принудительно завершить поток, зависший на функции Connect (winsock)
Пишу программу клиент для работы по TCP. Использую библиотеку winsock. Т.к. некоторые функции могут подвесить программу, создаю для...

Как завершить поток принудительно без смс и регистрации и гарантировать выполнение finally?
Привет, в C# я бы сделал так Thr.Abort(); Thr.Join();// дабы удостовериться о выходе и при выходе поток выполняет секцию finally, а...

Как принудительно завершить функцию recvfrom
Добрый день. Подскажите как завершить ф-н recvfrom? Приложение ждет данных из сети , но если нужно выйти из программы то как...

Как принудительно завершить консольную программу ?
return EXIT_SUCCESS; не канает, почему ? Он находится в функции которая при несовпадении данных должна закрывать программу. ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
17
Ответ Создать тему
Новые блоги и статьи
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка.
Programma_Boinc 23.12.2025
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка. Рецензия / Мнение/ Перевод https:/ / **********/ gallery/ thinkpad-x220-tablet-porn-gzoEAjs . . .
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru