gpt4 book ai didi

multithreading - 如何使用Delphi和OmniThread在后台将文件上传到azure?

转载 作者:行者123 更新时间:2023-12-03 15:14:50 27 4
gpt4 key购买 nike

我尝试使用 Delphi 将 100 个文件上传到 azure。但是,这些调用会阻塞主线程,因此我想通过异步调用或后台线程来完成此操作。

这就是我现在所做的(如 explained here ):

procedure TCloudManager.UploadTask(const input: TOmniValue;
var output: TOmniValue);
var
FileTask:TFileTask;
begin
FileTask := input.AsRecord<TFileTask>;

Upload(FileTask.BaseFolder, FileTask.LocalFile, FileTask.CloudFile);
end;

function TCloudManager.MassiveUpload(const BaseFolder: String;
Files: TDictionary<String, String>): TStringList;
var
pipeline: IOmniPipeline;
FileInfo : TPair<String,String>;
FileTask:TFileTask;
begin
// set up pipeline
pipeline := Parallel.Pipeline
.Stage(UploadTask)
.NumTasks(Environment.Process.Affinity.Count * 2)
.Run;
// insert URLs to be retrieved
for FileInfo in Files do
begin
FileTask.LocalFile := FileInfo.Key;
FileTask.CloudFile := FileInfo.Value;
FileTask.BaseFolder := BaseFolder;

pipeline.Input.Add(TOmniValue.FromRecord(FileTask));
end;//for

pipeline.Input.CompleteAdding;

// wait for pipeline to complete
pipeline.WaitFor(INFINITE);
end;

但是这个 block 也是(为什么?我不明白)。

最佳答案

这会阻塞,因为您正在调用 WaitFor,它会等待所有管道阶段完成其工作。在此等待期间,GUI 被阻止。

正确的做法是

  1. 将从 Parallel.Pipeline 返回的接口(interface)存储在全局存储中(例如,在 TCloudManager 字段中)。
  2. 为管道安排工作。
  3. 不要 WaitFor end,而是分配 OnStop 处理程序并执行此处所需的任何清理操作(不要忘记清空保存管道接口(interface)的全局存储)。

要执行第 3 步,您需要来自 SVN 的新 OmniThreadLibrary因为我刚刚添加了这个功能:)

procedure TCloudManager.MassiveUpload(const BaseFolder: String;
Files: TDictionary<String, String>);
var
FileInfo : TPair<String,String>;
FileTask:TFileTask;
begin
// set up pipeline
FPipeline := Parallel.Pipeline
.Stage(UploadTask)
.NumTasks(Environment.Process.Affinity.Count * 2)
.OnStop(
procedure begin
ShowMessage('All done');
FPipeline := nil;
end)
.Run;
// insert URLs to be retrieved
for FileInfo in Files do
begin
FileTask.LocalFile := FileInfo.Key;
FileTask.CloudFile := FileInfo.Value;
FileTask.BaseFolder := BaseFolder;

FPipeline.Input.Add(TOmniValue.FromRecord(FileTask));
end;//for
FPipeline.Input.CompleteAdding;
end;

关于multithreading - 如何使用Delphi和OmniThread在后台将文件上传到azure?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9863740/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com