簡體   English   中英

Delphi中的圖標螺紋加載

[英]Threaded loading of icons in Delphi

使用Delphi 2009,試圖制作一個啟動器。 為了使它“快速”,我真的想在后台線程中加載圖標。

我使用過這里找到的解決方案: 可以從Vista Shell獲得48x48或64x64圖標嗎?

如果不在線程中運行,這可以正常工作。 一旦我把它放在一個線程中,一些圖標就不會被“獲取”,或者是某種通用圖標。 我甚至嘗試將線程序列化(使它們無效,但實際上卻產生了阻塞),但它產生了相同的結果。

所以,問題是:如何在線程中加載圖標(與鏈接示例具有相同的可用選項)?

/拉爾斯

編輯:在GetIconFromFile中添加了一些非常基本的錯誤檢查

if SHGetFileInfo( PChar( aFile ),
                FILE_ATTRIBUTE_NORMAL,
                SFI,
                SizeOf( TSHFileInfo ),
                SHGFI_ICON
                  or SHGFI_LARGEICON
                  or SHGFI_SHELLICONSIZE
                  or SHGFI_SYSICONINDEX
                  or SHGFI_TYPENAME
                  or SHGFI_DISPLAYNAME ) <> 0 then
begin
  if not Assigned( aIcon ) then
    aIcon := TIcon.Create;
  aImgList := GetImageListSH( SHIL_FLAG );
  aIndex := SFI.iIcon;
  if aImgList <> 0 then
    aIcon.Handle := ImageList_GetIcon( aImgList, aIndex, ILD_NORMAL );
end;

這並沒有任何不同之處。 我仍然得到一些通用圖標(只有在線程中調用它時)

Edit2:線程代碼(非常簡單):

procedure TIconLoader.Execute;
var
  Item : TGridItem;
  I : TIcon;
begin
  inherited;

  while not terminated do
  begin
    Item := nil;
    if assigned(FOnNeedGridItem) then
    begin
      Synchronize(
          procedure
          begin
            FOnNeedGridItem(Self, Item);
          end
      );
    end;

    if assigned(Item) then
    begin
      GetIconFromFile(Item.FFilename, I, SHIL_EXTRALARGE);
      Synchronize(
          procedure
          begin
            Item.SetIcon(I);
          end
      );
//      I.Free;
    end
    else
      Terminate;
  end;
end;

SHGetFileInfo的文檔指定在調用函數之前必須初始化COM。 由於COM初始化是每個線程,因此需要在線程中初始化COM。 這意味着從線程的Execute方法調用CoInitializeCoInitializeEx

也許您可以使用Delphi 2009中引入的TThread.Queue方法來簡化線程代碼。

這里給出了一些提供一些示例和背景信息的文章:

使用參數進行同步和隊列

TThread.Queue是非阻塞的。 這允許為所有圖標順序創建后台工作線程,然后讓它們異步加載。

試試這個:

GetIconFromFile(Item.FFilename, I, SHIL_EXTRALARGE);

進入synchronize塊。 你應該在使用SHGetFileInfo()之后調用DestroyIcon SHGetFileInfo()

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM