Перейти к содержанию
Fire Monkey от А до Я
  • 0

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


giveaway

Вопрос

Пишу утилиту по скачиванию файлов. Нужно, чтобы по нажатию кнопки Pause закачка прекращалась, без выхода из программы (часть с дозакачкой уже мной написана). Как принудительно завершить поток, созданный функцией CreateThread?

Поток создается так: Thread=CreateThread(NULL,0,ThreadFun,&ThreadData, 0, 0);
Принудительно он завершается так: TerminateThread(Thread,0);
Это приводит к зависанию программы. В принципе в хелпе и не советуют использовать данный способ из-за непредсказуемости поведения. Нужно что-то другое.

 

Ссылка на комментарий

Рекомендуемые сообщения

  • 0

а чем вам не угодил TThread ?

кроме того, если у вас что-то обращается в сеть, прервать это что-то не удастся, только выйти по тайм-ауту.

поток просто ждет этого выхода, не блокируя программу.

Ссылка на комментарий
  • 0
4 часа назад, krapotkin сказал:

а чем вам не угодил TThread ?

В Emborcadero XE5 для Firemonkey не нахожу такого компонента

 

4 часа назад, krapotkin сказал:

кроме того, если у вас что-то обращается в сеть, прервать это что-то не удастся, только выйти по тайм-ауту.

поток просто ждет этого выхода, не блокируя программу.

 

Что значит выйти по тайм-ауту? В одном потоке в цикле идет скачивание неск. файлов и поверка необ-ти завершения. Как завершить поток когда уже запустился шаг цикла? Файлы качаются большого размера. Если поток ушел в сеть, то что получается его уже никак не вернуть (а мне и надо его прервать)? Неужели машины победили человека?))

Ссылка на комментарий
  • 0
  • Модераторы

Посмотрите примеры студии

примерный путь

Цитата

C:\Users\Public\Documents\Embarcadero\Studio\18.0\Samples\Object Pascal\RTL\HttpAsyncDownload

C:\Users\Public\Documents\Embarcadero\Studio\18.0\Samples\Object Pascal\RTL\HttpDownload

 

Ссылка на комментарий
  • 0
13 часов назад, giveaway сказал:

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

Если можно принимать данные блоками, то можно так
 

  WHILE NOT ThreadData.Terminated DO BEGIN 
  END;


Сейчас уже не помню почему но перешёл на BeginThread.

Ссылка на комментарий
  • 0
3 часа назад, giveaway сказал:

А можно ли как-то прервать работу функции get компонента IdHTTP?

Попробуйте в его событии OnWork просто вызвать Abort (при определенном условии, конечно)

А вообще у меня прекрасно отрабатывает следующее:

    if Assigned(FIdFTP) and FIdFTP.Connected then
    begin
      // Cancel FTP upload
      FIdFTP.Abort;
      FIdFTP.DisconnectNotifyPeer;
      FIdFTP.Disconnect;
    end;
    if Assigned(FIdHTTP) and FIdHTTP.Connected then
    begin
      // Cancel HTTP upload
      FIdHTTP.DisconnectNotifyPeer;
      FIdHTTP.Disconnect;
    end;

 

Изменено пользователем dnekrasov
Ссылка на комментарий
  • 0

Новая незадача. Напомню, поток у меня создается так: Thread=CreateThread(NULL,0,ThreadFun,&ThreadData, 0, 0);
И я хочу обеспечить совместимость с Маком. Но оказывается функция CreateThread не идет под Мак, билдер на нее ругается. Куда копать?)

Ссылка на комментарий
  • 0
4 часа назад, giveaway сказал:

поток у меня создается так:

даже под винду CreateThread не стоит использовать. Вместо него нужен BeginThread.

А для кроссплатформенности - uses System.Classes , класс TThread, как вам уже несколько раз сказали. И да - в палитре компонентов его нет, на форму не кинешь. Максимум - через File - New - New thread (или как-то так, Delphi лень открывать).

Ссылка на комментарий
  • 0
В 09.12.2016 в 23:00, giveaway сказал:

не советуют использовать данный способ из-за непредсказуемости поведения.

чего это вдруг поведение непредсказуемо? Очень даже предсказуемо. Был поток - и враз не стало, он даже мявкнуть не успеет. Соответственно - все локальные переменные в функции потока померли, память утекла ну и прочие прелести.

Ссылка на комментарий
  • 0
7 часов назад, giveaway сказал:

И я хочу обеспечить совместимость с Маком. Но оказывается функция CreateThread не идет под Мак, билдер на нее ругается. Куда копать?)

Очень советовал бы обратить своё внимание на TTask из System.Threading - ну ооччеень полезный класс

Можете посмотреть запись вебинара где про него подробно рассказывают

Изменено пользователем dnekrasov
Ссылка на комментарий

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить на вопрос...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

  • Последние посетители   0 пользователей онлайн

    • Ни одного зарегистрированного пользователя не просматривает данную страницу
×
×
  • Создать...