Delphi XE线程:如何实现函数调用缓冲区?

时间:2011-09-05 07:50:54

标签: multithreading delphi soap delphi-xe buffer

我正在尝试实现一个函数调用缓冲区。我的问题是功能与用户的答案有关。所以函数可以执行很长时间(由于等待用户回答),我的函数必须按以下顺序调用:

  function 1 started
  waiting for user,  (here function 2 is waiting for function 1) 
  function 1 ended

  function 2 started
  waiting for user
  function 2 ended

  ...

因此在函数1结束之前无法调用函数2。

我需要的是这样的事情:

function MyFunc: string;
begin
  Caption.Text := 'Answer required';
  while not ButtonSend_WasPress do 
   Application.ProcessMessages;
  Result := Memo2.Text;
  ButtonSend_WasPress := False;
end;

procedure OnAnswerRequired(Request: string);
begin
  Memo1.Text := Request;
  Memo2.Text := MagicalAddFunctionToCallBufferAndGetFunctionResult(MyFunc);
end;

或者可能是这样的:

procedure OnAnswerRequired(Request: string);
var MyThread:TThread;
begin
  Memo1.Text := Request;

  MyThread := TThread.CreateAnonymousThread(
    procedure begin
      Memo2.Text := MyFun;
    end
  );
  MagicalAddThreadToBuffer(MyThread);
end;

更新

问题还在于OnAnswerRequired是一个复杂对象的事件,每个调用实例都位于自己的线程中。所以我不能只在一个线程中执行函数。

我正在开发测试程序。使用此测试程序,人工测试程序模拟Web服务。 Web服务有一个函数(function Transmit(text: string): string;),它是一个Delphi Web服务函数,可以在自己的线程中工作。当人类模仿网络服务得到文本请求时,他正在思考很多然后回答。 人类测试人员希望请求按照创建顺序显示,并且只有在之前的请求被回答后才能显示下一个请求。

网络服务没有自己的主题。相反,每当请求到达时,Delphi都会在 new 线程中执行Transmit函数。在函数退出之前,必须有一个答案(Delphi会在soap中发送结果作为web服务函数的结果)。并且退出后函数不能返回结果值。所以我总会有很多函数的实例。问题是如何为函数实例实现FIFO队列。

1 个答案:

答案 0 :(得分:5)

由于在函数1结束之前无法调用函数2,因此没有必要使用线程(事情不是并行完成的)。对我来说,看起来你不必要地使事情变得复杂......只需按顺序调用函数并在其中显示模态对话框以获得用户输入。