1

如何正确停止 Pipleline 任务,我已经尝试过,但是当我按下 Abort 按钮时,我得到了一个 AV,我不太擅长调试,我已经DoOnStop(task);在 OtlParallel 中达到了,然后我不知道下一步该做什么,我相信有什么遗漏吗?

type
   procedure SetInProcess(const Value: Boolean);
private
   FInProcess: Boolean;
   property inProcess: Boolean read FInProcess write SetInProcess;
public
   FStopAll: Boolean;
   procedure FlushData;
   procedure Retriever(const input: TOmniValue; var output: TOmniValue);
  ...
  procedure TForm1.SetInProcess(const Value: Boolean);
  var
    I: Integer;
  begin
    if Value = InProcess then exit;
    memo1.ReadOnly := Value;
    FInProcess := Value;
    if Value then
     Memo1.Lines.Clear;
     Timer1.Enabled := Value;
     If not Value then
     begin
       FlushData;
       pipeline := nil;  
     end;
   end;

 procedure TForm1.Timer1Timer(Sender: TObject);
 begin
   If not InProcess then exit;
    FlushData;
   if Pipeline.Output.IsFinalized then
    InProcess := False;
   end; 
procedure TForm1.StartButton(Sender: TObject);
var
  i      : integer;
 urlList : TStrings;
 U, S    : string;
 value   : TOmniValue;
begin
  urlList := Memo2.Lines;
  pipeline := Parallel.Pipeline;

  pipeline.Stage(Retriver).NumTasks(StrToInt(Edit12.Text)).Run;

  for U in urlList do
   pipeline.Input.Add(U);
   pipeline.Input.CompleteAdding;
   inProcess := True;
 end;
procedure TForm1.FlushData;
var v: TOmniValue;
begin
  if pipeline = nil then exit;
  if pipeline.Output = nil then exit;

  Memo1.Lines.BeginUpdate;
  try
    while pipeline.Output.TryTake(v) do
    Memo1.Lines.Add(v.AsString);
    if FStopAll then
        begin
          Pipeline.Cancel;
        end;
    Memo1.Lines.EndUpdate;
 except
   on E: Exception do
   begin
     Memo1.Lines.Add(E.Message);
   end;
 end;
  Memo1.Lines.EndUpdate;      
end;

procedure TForm1.Retriver(const input: TOmniValue; var output: TOmniValue);
var
  lHTTP                 : TIdHTTP;
  Params                : TStrings;
  Reply,String1,String2 : string;
begin
  X      := Input.AsString;
  Params := TStringList.Create;
  string1   := Extract1(X);
  string2   := Extract2(X);;

  Params.Add('username=' + string1);
  Params.Add('password=' + string2);

  lHTTP := TIdHTTP.Create(nil);
  try
  ...
  Reply := lHTTP.Post('https://www.instagram.com/accounts/login/ajax/', Params);
    if AnsiContainsStr(Reply, 'no')
    then
    begin
      Alive.Add(string1+string2+' Client ok'); ///Alive is Global Var stringlist created earlier
    end;
  except
     on E: EIdHTTPProtocolException do       
         Exit
  end;
  lHTTP.Free;
end;
 procedure TForm1.AbortButton(Sender: TObject);
 begin
   try
     FStopAll := False;
   finally
     FStopAll := True;
   end;
 end;
4

1 回答 1

2

在您过度简化的单阶段管道的情况下,将检查移动到工作阶段本身就足够了。

procedure Retriever(const input: TOmniValue; var output: TOmniValue);
var 
  ....
begin
   if FStopAll then exit;
   X   := Input.AsString;
....

PS。我想重复一遍,您的代码严重泄漏内存,并且您忽略了我之前所说的所有注释。

聚苯乙烯。这段代码也没有什么意义(flip-vloppign 将变量转换为一个值然后再转换为另一个值没有意义),但在语法上不正确并且不会编译。因此,它与您实际运行的代码不同。这是一些不同的代码。

procedure TForm1.AbortButton(Sender: TObject);
 begin
   try
     FStopAll := False;
   finally
     FStopAll := True;
   end;
 end;
于 2016-09-19T19:28:26.957 回答