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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 22.08.2010, 22:42   #1
kardinal94
Форумчанин
 
Аватар для kardinal94
 
Регистрация: 26.04.2010
Сообщений: 105
По умолчанию Зависание программы.

Существует такая ситуация:
У меня есть программа, она автоматически обновляется через интернет. Обновление происходить с помощью другого EXE файла. то есть главная закрывается и открывается апдейтер, который удаляет страрую версию основной программы и скачивает новую.
Загрузка происходит с помощью:
Код:
function GetInetFile(const fileURL, FileName: String): boolean;
const BufferSize = 1024;
var hSession, hURL: HInternet;
Buffer: array[1..BufferSize] of Byte;
BufferLen: DWORD;
f: File;
sAppName: string;
begin
   Result:=False;
   sAppName := ExtractFileName(Application.ExeName);
   hSession := InternetOpen(PChar(sAppName), INTERNET_OPEN_TYPE_PRECONFIG,
         nil, nil, 0);
   try
      hURL := InternetOpenURL(hSession,
      PChar(fileURL),nil,0,0,0);
      try
         AssignFile(f, FileName);
         Rewrite(f,1);
         repeat
            InternetReadFile(hURL, @Buffer, SizeOf(Buffer), BufferLen);
            BlockWrite(f, Buffer, BufferLen)
         until BufferLen = 0;
         CloseFile(f);
         Result:=True;
      finally
      InternetCloseHandle(hURL)
      end
   finally
   InternetCloseHandle(hSession)
   end
end;
Ну при нажатии на кнопку эта часть:
Код:
var FileOnNet, LocalFileName: string;
verin:tinifile;
begin
   FileOnNet:='...';
   LocalFileName:='project2.exe';
          application.ProcessMessages;
   if GetInetFile(FileOnNet,LocalFileName)=True then
      begin
      ShowMessage('Обновление завершено!');
      verin:=tinifile.Create('VerIn.ini');
      verin.WriteString('Ver','Ver', edit1.Text);
      end
   else
      ShowMessage('Ошибка! Проверьте ваши настройки интернета. При необходимости обратитесь в тех службу.');
Так теперь собстенно проблема в другом. Мне надо получать размеры файлов на сервере и на компе. На компе я получаю с помощью:
Код:
function GetFileSize(FileName: String): Integer;
var
  FS: TFileStream;
begin
  try
    FS := TFileStream.Create(Filename, fmOpenRead);
  except
    Result := -1;
  end;
  if Result <> -1 then Result := FS.Size;
  FS.Free;
end;
А на сервере:
Код:
HTTP := TIdHTTP.Create(nil);

 HTTP.Head('http://promous.ru/Project2.exe');
 Razmer := HTTP.Response.ContentLength; //размер файла
 HTTP.Free;
 Razmer := Round (Razmer / 1024);
Edit3.text:=IntToStr (Razmer) + ' KB';
Проблема в том, что при загрузке значение размера файла на компе должно меняться каждое мгновение, но это не происходит, программа на время загрузки просто подвисает, а потом выдает, что успешно обновился. Как можно решить данную проблему
kardinal94 вне форума Ответить с цитированием
Старый 22.08.2010, 23:00   #2
ex.cluz
Участник клуба
 
Аватар для ex.cluz
 
Регистрация: 15.01.2010
Сообщений: 1,325
По умолчанию

На первый взгляд, может, так:
Код:
function GetInetFile(const fileURL, FileName: String): boolean;
const BufferSize = 1024;
var hSession, hURL: HInternet;
Buffer: array[1..BufferSize] of Byte;
BufferLen: DWORD;
f: File;
sAppName: string;
begin
   Result:=False;
   sAppName := ExtractFileName(Application.ExeName);
   hSession := InternetOpen(PChar(sAppName), INTERNET_OPEN_TYPE_PRECONFIG,
         nil, nil, 0);
   try
      hURL := InternetOpenURL(hSession,
      PChar(fileURL),nil,0,0,0);
      try
         AssignFile(f, FileName);
         Rewrite(f,1);
         repeat
            InternetReadFile(hURL, @Buffer, SizeOf(Buffer), BufferLen);
            Application.ProcessMessages;
            BlockWrite(f, Buffer, BufferLen)
         until BufferLen = 0;
         CloseFile(f);
         Result:=True;
      finally
      InternetCloseHandle(hURL)
      end
   finally
   InternetCloseHandle(hSession)
   end
end;
И тут:
Код:
HTTP := TIdHTTP.Create(nil);

 HTTP.Head('http://promous.ru/Project2.exe');
 Razmer := HTTP.Response.ContentLength; //размер файла
 HTTP.Free;
 Razmer := Round (Razmer / 1024);
Edit3.text:=IntToStr (Razmer) + ' KB';
Update;
Но это без вникания в код, "на вскидку".
Грибы - они разные. Один тебя накормит, другой тебе кино покажет...
Редактор журнала "
[ПРОграммист]"
Yan's Home Digital Lab
ex.cluz вне форума Ответить с цитированием
Старый 23.08.2010, 17:36   #3
FaTaL
Участник клуба
 
Аватар для FaTaL
 
Регистрация: 09.11.2007
Сообщений: 1,761
По умолчанию

Прав ex.cluz но лучше просто сделать в отдельный поток скачку файла.
FaTaL вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
зависание DeDoK Работа с сетью в Delphi 7 17.08.2010 09:56
Зависание программы при выполнении GET запроса iHikita Общие вопросы .NET 1 16.07.2010 00:20
CriticalSection -> зависание программы PUH Помощь студентам 1 05.11.2009 13:19
Зависание JRcoker Общие вопросы Delphi 8 06.08.2008 08:29
"Зависание" программы. no. Общие вопросы Delphi 2 19.02.2007 08:44