我如何将备注行字符串传递给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;
但是在管道模式中我必须使用记录,所以我可以将参数传递给队列。或者有没有办法使用Email
和Name
作为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;
感谢任何帮助。
答案 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;
让解析发生在管道中。在那里,您可以使用从TOmniValue
到string
的隐式广告。