Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Сети > Программа как бы зависает при потере фокуса!?


Автор: Rodeon 1.4.2012, 23:31
Windows 7 32-bit
Delphi 7

Программа делает следующее - из заранее готового списка по очереди загружает картинки с интернета, сами картинки (они имеют одинаковый размер) загружаются после выполнения функции:
Код


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;

На диск, после чего отображаються в Image-е и так далее.
Пробовал напярмую загружать сперва в Image путем такой функции:
Код


function GetImage(url:string): TPicture;
var
  hInternet, hConnect: pointer;
  dwBytesRead, i, L: cardinal;
  sTemp,aUrl: AnsiString; // текст страницы
  memStream: TMemoryStream;
  jpegimg: TJPEGImage;
begin
  hInternet := InternetOpen('MyApp', INTERNET_OPEN_TYPE_PRECONFIG, nil, nil, 0);
  try
    if Assigned(hInternet) then
    begin
      hConnect := InternetOpenUrl(hInternet, PChar(url), nil, 0, 0, 0);
      if Assigned(hConnect) then
        try
          i := 1;
          repeat
            SetLength(sTemp, L + i);
            if not InternetReadFile(hConnect, @sTemp[i], sizeof(L),dwBytesRead) then
              break; // Получаем данные с сервера
            inc(i, dwBytesRead);
            until dwBytesRead = 0;
        finally
          InternetCloseHandle(hConnect);
        end;
    end;
  finally
    InternetCloseHandle(hInternet);
  end;
  memStream := TMemoryStream.Create;
  jpegimg := TJPEGImage.Create;
  try
    memStream.Write(sTemp[1], Length(sTemp));
    memStream.Position := 0;
    //загрузка изображения из потока
    jpegimg.LoadFromStream(memStream);
    Result:=TPicture.Create;
    Result.Assign(jpegimg);
  finally
    //очистка
    memStream.Free;
    jpegimg.Free;
  end;
end;

Вызываю ее так:
Image1.Picture:=GetImage('адрес');

Собственно сам вопрос - Пока фокус на программе, все прекрасно работает, но стоит только попробовать переместить окно программы или начать работать в другой программе - все, программа зависает (по крайней мере так пишеться в заголовке).
Хотя на самом деле она работает, файлы сохраняються.
Нету только самой визуализации (загрузки в Image);

Кто бы мог подсказать что можно сделать?

P.S. Formstyle=fsStayOnTop не вариант, что бы прога висела поверх всех окон, хотя даже в данном случае программа при перетаскивании тоже как бы виснет.

Автор: Данкинг 1.4.2012, 23:41
Вставь Application.ProcessMessages в цикле сохранения картинок.

Автор: Rodeon 1.4.2012, 23:50
Блин, точно, работает!
Главно Application.ProcessMessages у меня стоит в цикле, только я ее в комменты поместил по ошибке вместе с другим описанием.
Спасибо за оперативность!

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)