Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 06.04.2010, 22:26   #1
Cold_Night
Пользователь
 
Регистрация: 13.02.2009
Сообщений: 32
По умолчанию Загрузка в отдельном потоке TIdHTTP всё равно "замораживает" форму

Привет всем! Собственно, сабж. Делаю загрузку через TIdHTTP в отдельном потоке TThread.

Код:
 type TMyThread = class(TThread); // мой класс-потомок TThread;
 private
 //
 public;
 procedure Execute; override;
end;
...

Код:
  procedure TMyThread.Execute;
var F: TFileStream;
 begin
  with Form1 do
 begin
  F:=TFileStream.Create(LabeledEdit2.Text, fmCreate);
 IdHTTP1.Get(LabeledEdit1.Text, F);
 F.Free;
end;
end;
Ну и потом создаю конструктором Create с параметром True объект моего класса, и вызываю методы Resume и Execute в обработчике нажатия кнопки. Однако форма всё равно замерзает. В чём моя ошибка? Заранее спасибо
Cold_Night вне форума Ответить с цитированием
Старый 06.04.2010, 22:37   #2
mosq
Пользователь
 
Регистрация: 28.08.2009
Сообщений: 90
По умолчанию

может тут:
Код:
 IdHTTP1.Get(LabeledEdit1.Text, F)
сначала грузить в простую переменную, а потом через synchronize присваивать Едиту?
mosq вне форума Ответить с цитированием
Старый 06.04.2010, 22:41   #3
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

Код:
type TMyThread = class(TThread);
 private
  FURL:string;
  FFile:string;
 public
  procedure Execute; override;
  constructor Create(AURL:string;AFile:string);
end;

constructor TMyThread.Create;
begin
 inherited Create(true);
 FFile:=AFile;
 FURL:=AURL;
 FreeOnTerminate:=true;
 Resume;
end;

procedure TMyThread.Execute;
var F:TFileStream;
     H:TIdHTTP;
begin
 H:=TidHTTP.create(nil);
 F:=TFileStream.Create(FFile,fmCreate);
 H.Get(FURL,F);
 H.Free;
 F.Free;
 Terminate;
end;
примерно так.
в кнопке начать закачку, пишем
Код:
TMyThread.Create(LabeledEdit1.Text,LabeledEdit2.Text);
запомните, лучше всего вообще исключить доступ потока к компонентам формы, иначе смысл от потока?
(или уж по крайней мере синхронизацию делать)
Цитата:
и вызываю методы Resume и Execute в обработчике нажатия кнопки.
я выделенного не понял, зачем?
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 07.04.2010, 19:35   #4
Alter
Старожил
 
Аватар для Alter
 
Регистрация: 06.08.2007
Сообщений: 2,183
По умолчанию

Вот есть исходник качалки, типа ДаунлоадерМастер. Вообще-то есть компонент IdAntiFreeze(должен быть только один на всю программу), избавит от зависания во время работы idHttp.
Вложения
Тип файла: rar Download_Plus.rar (136.9 Кб, 45 просмотров)

Последний раз редактировалось Alter; 07.04.2010 в 19:38.
Alter вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Загрузка оборудования(вариант "Задачи о ранце") matteo Общие вопросы C/C++ 1 11.03.2011 11:49
Загрузка данных в отдельном потоке Dj_smart Gamedev - cоздание игр: Unity, OpenGL, DirectX 8 18.01.2010 23:29
при вводе на листе "магазин"- код товара появлялось "описание" товара из "склада" с "продажной ценой" aleksei78 Microsoft Office Excel 13 25.08.2009 12:04