1

我如何将备忘录行字符串传递给TRecords字段以使用主题作为 idHTTP POST 方法的参数?

通常我会这样做

for i := 0 to Memo1.Lines.Count-1 do
begin
  P := Pos('+', Memo1.Lines.Strings[i]);
  Email:= Copy(Memo2.Lines.Strings[i], 1, P-1);
  Name:= ExtractName(Memo2.Lines.Strings[i]);
  lPOSt // HTTP POST; //Email&Name Global Var for HTTP post Params
  Sleep(1000);
 end;

但是在管道模式中我必须使用记录,所以我可以将参数传递给队列。或者有什么方法可以使用EmailName作为 POST 方法的参数?

 Reply := TStringList.Create;
 Params.Add('Email=' + Email); // Email is Global Var
 Params.Add('Name=' + Name);   // Name is Global Var
 lHTTP.Post('http://www.mywebserverx.com/', Params);

type
  TRecords = record
  Name : string;
  eMail : string;
  Car: string;
end;

我的管道代码,使用 HTTP Get

procedure TForm2.StartButtonClick(Sender: TObject);
var
  s       : string;
  urlList : TStrings;
begin
  urlList := Memo1.Lines;
 pipeline := Parallel.Pipeline;  
 pipeline.Stage(Retriever).NumTasks(10).Run;

// Retriever>>>idHTTP GET opertaion
//how to modify the pipeline input after using records as Params?

 for s in urlList do
  pipeline.Input.Add(s);
  pipeline.Input.CompleteAdding;

任何帮助表示赞赏。

4

1 回答 1

1

pipeline.Input是类型IOmniBlockingCollection。方法IOmniBlockingCollection.Add需要一个类型为 的参数TOmniValue。对于大多数类型,您可以简单地将变量作为参数,因为TOmniValue实现了许多隐式类运算符。当变量不是 type 时,这些隐式类运算符会为您完成所有工作TOmniValue

但是,TOmniValue没有为记录实现隐式类运算符。对于记录类型,您必须将其转换为TOmniValue自己。幸运的是,TOmniValue有一个通用的类函数:TOmniValue.CastFrom<T>().

所以,如果你想添加一个类型的记录TRecords(这是一个糟糕的、模棱两可的名字,恕我直言),你只需调用pipeline.Input.Add(TOmniValue.CastFrom<TRecords>(RecordsVar).

但是为什么要在调用线程中进行所有解析呢?

调用线程应该像当前实现的那样添加字符串:

for s in urlList do
  pipeline.Input.Add(s);
pipeline.Input.CompleteAdding;

让解析发生在管道中。在那里你可以使用隐式转换 from TOmniValueto string

于 2016-08-30T08:57:03.370 回答