0

通过在此处跟进我之前关于listview 线程内部更新的问题

我开始以不同的方式思考以解决我以前的问题,因为下载过程需要太长时间并且占用太多带宽我想下载GIFimage然后将其保存在磁盘上然后稍后在我的应用程序中使用它这是当前下载线程代码

procedure TDownloadImage.Execute;
var
  aMs: TMemoryStream;
  aIdHttp: TIdHttp;
begin
  FGif := TGifImage.Create;
  try
    aMs := TMemoryStream.Create;
    try
      aIdHttp := TIdHttp.Create(nil);
      try
        aIdHttp.Request.UserAgent := 'Mozilla/5.0 (Windows NT 6.1; WOW64; rv:12.0) Gecko/20100101 Firefox/12.0';
        aIdHttp.Get(FURL, aMs); // here is the client FURL
      finally
        aIdHttp.Free;
      end;
      aMs.Position := 0;
      FGif.LoadFromStream(aMs);
      FGif.Transparent := True;
    finally
      aMs.Free;
    end;
    if Assigned(FOnImageReady) then
      Synchronize(DoImageReady);
    end;
  finally
    FGif.Free;
  end;
end;

我想在计算机客户端上保存 FURL 的图像然后如果该图像请求再次下载中止下载过程并从客户端计算机加载它我怎么可能做到这一点?

4

1 回答 1

0

正如 TLama 明智地说的那样,您正在寻找一个完整的缓存机制。在 Delphi 中,您可能希望将其称为 TDictionary。

如果您想将 Gif 和 URI 保存在内存中,那么您可以使用 TDictionary 对来保存每个内存流和 uri,一切都会快速运行。

如果您想将数据存储在文件中,并且每次应用程序开始记住上次运行的状态时,您可能希望找到一种方法来存储数据、数据库或文本文件。

如果您想要一个可以提供帮助的简单文本文件,则Ini文件可以完成这项工作,但是,随着文本文件的增长,趋于变慢,并使搜索变慢,然后文件获取。

如果您使用良好的便携式数据库,那么搜索可能会很快。

带有 Ini 文件的示例代码可帮助您入门:伪代码。

var 
  filename:string;//where is the key value is stored.
  GifLocation:string;//result of the cache hit.
const
  URI = 'http://sstatic.net/stackexchange/img/logos/so/so-logo-med.png?v=a4a65015804e';
begin
  with TIniFile.create(filename) do
  try
    GifLocation := readString('FilesLocation',URI,'');
  finally
    free;
  end;
  if ('' = GifLocation) then 
    fetchBoy(URI)
  else IGotIt_IGotIt(GifLocation);
end;

实现你的fetchBoy, 来做一个 http 获取,并IGotIt_IGotIt加载文件流。

于 2015-09-10T14:36:54.877 回答