0

我正在编写一个检测 USB 插入并将插入的驱动器保存到 StringList 的程序。现在我想为 StringList 的每个内容创建一个 NewTask 或 Background Worker,立即启动它们并等待所有任务使用 OmniThread 库完成。

这是我的代码片段

uses

  Winapi.Windows, Winapi.Messages, System.SysUtils, System.Classes,
  Winapi.ShellApi, OtlCommon,
  OtlCollections,
  OtlParallel, Vcl.Dialogs;

procedure TUSB.WMDeviceChange(var Msg: TMessage);
var
  lpdbhHeader: PDevBroadcastHeader;
  ResStringList, TempSenderList: TStringList;
  i: Integer;

begin
  lpdbhHeader := PDevBroadcastHeader(Msg.LParam);
  ResStringList := TStringList.Create;
  TempSenderList := TStringList.Create;
  ResStringList.Clear;
  TempSenderList.Clear;

  try
    case Msg.WParam of
      DBT_DEVICEARRIVAL:
        begin
          if (lpdbhHeader^.dbch_devicetype = DBT_DEVTYP_VOLUME) then
          begin

            Sleep(2000);
            // Procedure to get connected USB Devices and save to a StringList

            (GetDrive(PDevBroadcastVolume(Msg.LParam), ResStringList));

            for i := 0 to ResStringList.Count - 1 do
            begin
              { How do I create a NewTask or
                Background Worker for each content in ResStringList
                to execute WalkDirectory and Parallel.ForEach(0, TempSenderList.Count - 1)
                in the NewTask? }

              // Procedure to Recurse content of the USB Drive and Save to TempSenderList

              WalkDirectory(ExcludeTrailingPathDelimiter(ResStringList.Strings
                [i]), TempSenderList);

              Parallel.ForEach(0, TempSenderList.Count - 1).Execute(
                procedure(const value: Integer)
                begin

                  // DoSomeThing(TempSenderList[value]);

                end);

              ShowMessage(TempSenderList.Text);

            end;

          end;
        end;
      DBT_DEVICEREMOVECOMPLETE:
        begin
          if (lpdbhHeader^.dbch_devicetype = DBT_DEVTYP_VOLUME) then
          begin
            // ShowMessage('Removed');
          end;

        end;
    end;
  finally
    ResStringList.Free;
    TempSenderList.Free;
  end;

end;

使用 Delphi XE7 和 OmniThread 库 v3.04。

4

0 回答 0