2012-03-25 7 views
5

私はDelphiで紺碧に+100ファイルをアップロードしようとしました。しかし、呼び出しはメインスレッドをブロックするので、非同期呼び出しまたはバックグラウンドスレッドを使用してこれを実行します。DelphiやOmniThreadを使用して背景を紺色にアップロードする方法はありますか?

これは私が今何をすべきかです(のような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; 

しかし、このブロックはあまりにも(私はなぜ理解していません?)。

答えて

4

など、このブロックをアップロード/ダウンロードのための非同期バリアントを持っています。その待機中に、GUIはブロックされます。それを行うには

適切な方法は、(TCloudManagerフィールド内など)グローバルストレージにParallel.Pipelineから返さ

  1. ストア・インタフェースです。
  2. パイプラインへの作業をスケジュールします。
  3. Do not WaitForは終了しますが、OnStopハンドラを割り当て、ここで必要なクリーンアップを行います(パイプラインインターフェイスを保持するグローバルストレージを除外しないことを忘れないでください)。私はちょうどこの機能を追加したので、あなたがSVNから新鮮OmniThreadLibraryをする必要がありますステップ3を行うには

:)

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; 
+0

ここにお会いできて嬉しいです。パイプラインはこれに適したツールですか? – mamcx

+0

本当にありません。私はParallel.ForEachをやるだけです。 – gabr

+0

私はParallel.ForEachでも試してみましたが、Application.ProcessMessages()を挿入する必要があり、流動的ではありませんでした。おそらくライブラリの使用の私の不足のために... – mamcx

-5

Delphiには.NETの亜種があります。 Azure Storage Service用の.NET Managed APIがあることをご存知でしたか?あなたは自分の仕事を完了するために、すべてのパイプラインステージを待っWAITFORを呼び出しているので、

CloudBlockBlobクラスは

http://msdn.microsoft.com/en-us/library/windowsazure/microsoft.windowsazure.storageclient.cloudblockblob_methods.aspx

+0

はい、存在するが、私はネイティブDelphiでこれを必要としています。 – mamcx

+2

-1。これはここで質問される質問とはまったく関係がなく、回答として投稿されるべきではありません。 –

+0

ケン - どうやって考えますか?彼がDelphi.NETを使用している場合、私は彼に目標に向けたライブラリを提供しました。これは、たくさんのファイルを非同期でアップロードする能力です。 – sebastus

関連する問題