如何使用Rcords将参数传递给队列

时间:2016-08-30 07:54:06

标签: http delphi records delphi-xe8 omnithreadlibrary

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

通常id就像这样做

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;

感谢任何帮助。

1 个答案:

答案 0 :(得分:1)

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

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

因此,如果您要添加TRecords类型的记录(这是一个糟糕的,不明确的名称,imho),您只需致电pipeline.Input.Add(TOmniValue.CastFrom<TRecords>(RecordsVar)

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

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

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

让解析发生在管道中。在那里,您可以使用从TOmniValuestring的隐式广告。