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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 27.02.2011, 01:45   #11
ArtGrek
DelphiProger
Участник клуба
 
Аватар для ArtGrek
 
Регистрация: 14.11.2010
Сообщений: 1,023
По умолчанию

Делаем прогресс
Теперь у нас осталась ещё одна проблема – оживить прогресс-бар. Но здесь нас подстерегает один момент: с потока нельзя просто так обращаться к компонентам формы. Точнее, правило звучит так: с одного потока нельзя обращаться к данным другого потока (переменным, коду) без специальных методов. Таких методов есть два. Первый – мы останавливаем один поток, а второй на это время получает доступ к его переменным. Либо второй поток просит первый исполнить какой-то код, а сам на это время засыпает.
Способ два, которым мы и воспользуемся – это посредник. Мы шлём сообщение посреднику, чтобы он сообщил другому потоку (а может и группе), чтобы он что-то сделал. Этот способ хорош тем, что поток может обрабатывать сообщения не по принуждению, а по возможности. То есть сообщения стают в очередь. В качестве посредника мы выберем саму среду Windows.
Итак, Windows при посылке сообщения позволяет передавать два целочисленных параметра. Первый мы будем использовать как идентификатор действий, второй – как дополнительный параметр.
Поехали дальше. После uses перед Type вставим строку:
Код:
const 
  MY_MESS = WM_USER + 100;
А в объявлении формы добавим новый метод:
procedure MyProgress(var msg:TMessage);message MY_MESS;
И заветное Ctrl+Shift+C
В свежесозданном обработчике пишем такое:
Код:
procedure TForm1.MyProgress(var msg: TMessage); 
begin 
  case msg.WParam of 
    0: begin ProgressBar1.Max:=msg.LParam;ProgressBar1.Position:=0; end; 
    1: ProgressBar1.Position:=msg.LParam; 
  end; 
end;
То-есть, если передали тип операции 0 – значит нужно инициализировать прогресс. Передали 1 – нужно выставить позицию. Как именно – указано в другом параметре (msg.LParam).
А теперь возвращаемся к нашим обработчикам IdHTTP, которые мы оставили без реализации. Туда нужно вписать всего по строчке. Ниже приведена реализация.
Код:
procedure TDownLoader.IdHTTP1Work(ASender: TObject; AWorkMode: TWorkMode; 
AWorkCount: Integer); 
begin 
  PostMessage(Application.MainForm.Handle,MY_MESS,1,AWorkCount); 
end; 
procedure TDownLoader.IdHTTP1WorkBegin(ASender: TObject; AWorkMode: TWorkMode; 
AWorkCountMax: Integer); 
begin 
  PostMessage(Application.MainForm.Handle,MY_MESS,0,AWorkCountMax); 
end;
VirusN13
ArtGrek вне форума Ответить с цитированием
Старый 27.02.2011, 02:23   #12
ArtGrek
DelphiProger
Участник клуба
 
Аватар для ArtGrek
 
Регистрация: 14.11.2010
Сообщений: 1,023
По умолчанию

у меня получилось, по прямои сшлке качает
VirusN13
ArtGrek вне форума Ответить с цитированием
Старый 27.02.2011, 12:27   #13
t2skler
Форумчанин
 
Аватар для t2skler
 
Регистрация: 25.11.2010
Сообщений: 164
По умолчанию

Я уже писал программу с использованием компонента из инди, размер программы увеличился на ~200 Кб, решил работать на более низком уровне с сетью с помощью WinSock. Увы не получилось.
Возможно Я Быдлокодер ©.
t2skler вне форума Ответить с цитированием
Старый 27.02.2011, 13:12   #14
t2skler
Форумчанин
 
Аватар для t2skler
 
Регистрация: 25.11.2010
Сообщений: 164
По умолчанию

Преобразовал функцию и всё заработало. Нужно было получать адрес сайта. Единственное эта функция возвращает файл с ответом на запрос, пока не понял как от этого избавится. А ну ещё сайтов юкоза он мне присылает 403 ошибку, хотя браузером я могу просматривать этот файл.
Код:
function DownloadFile(hHost, FileNameOnServer: String; Outfile:String): Integer;
var SockAddr1: TSockAddr;
     Socket1: TSocket;
     Buffer1: AnsiString;
     Buffer2: array[1..1024] of AnsiChar;
     info: WSADATA;
     NewFile: file;
     iRead: Integer;
begin
WSAStartup($202,info);
Buffer1:='GET /'+FileNameOnServer+' HTTP/1.1' + #13#10 +
'Host: '+hHost + #13#10 +
'Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8' + #13#10 +
'Accept-Language: ru,en-us;q=0.7,en;q=0.3' + #13#10 +
'Accept-Encoding: deflate' + #13#10 +
'Accept-Charset: windows-1251,utf-8;q=0.7,*;q=0.7' + #13#10 +
'Connection: close' + #13#10 +
'Cache-Control: max-age=0' + #13#10 +
#13#10;
Socket1:=Socket(AF_INET,SOCK_STREAM,0);
SockAddr1.sin_family:=AF_INET;
SockAddr1.sin_addr:=pinaddr(gethostbyname(PChar(hHost))^.h_addr^)^;
SockAddr1.sin_port:=htons(80);
connect(Socket1, SockAddr1, sizeof(SockAddr1));
send(Socket1,Buffer1[1],Length(Buffer1),0);
AssignFile(NewFile, Outfile);
Rewrite(NewFile,1);
 while (TRUE) do
 begin
  FillChar(Buffer2, SizeOf(Buffer2), 0);
  iRead:=Recv(Socket1, Buffer2, length(Buffer2), 0);
  BlockWrite(NewFile, Buffer2, iRead);
  if iRead<=0 then break;
 end;
CloseFile(NewFile);
CloseSocket(Socket1);
WSACleanup;
Result:=1;
end;

begin
 DownloadFile('programmersforum.ru','newreply.php?do=newreply&noquote=1&p=745539','C:\111.txt');
end.
Возможно Я Быдлокодер ©.
t2skler вне форума Ответить с цитированием
Старый 19.11.2018, 11:54   #15
Aqel
Пользователь
 
Аватар для Aqel
 
Регистрация: 07.05.2011
Сообщений: 24
По умолчанию

Цитата:
Сообщение от ArtGrek Посмотреть сообщение
у меня получилось, по прямои сшлке качает
Знаю старая тема, но у меня не качает, лишь делает вид - скачанного файла нету.

PS: Delphi XE8 sp1
Всё намного проще, чем есть на самом деле...
Aqel вне форума Ответить с цитированием
Ответ


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

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Закачка-докачка файла в потоке, с прогрессом Alter Работа с сетью в Delphi 2 13.01.2011 12:06
Закачка файла из Интернета _SERGEYX_ Работа с сетью в Delphi 3 18.01.2010 14:21
Закачка файла происходит в отдельном потоке. Kyran29 Работа с сетью в Delphi 1 28.11.2009 01:19
закачка файла отдельным потоком. ZeitGeist7 Общие вопросы Delphi 12 26.02.2009 20:23
Закачка файла с ссылки Titan123 Работа с сетью в Delphi 5 20.10.2008 13:25