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

Multithreading Delphi XE线程:如何实现函数调用缓冲区?,multithreading,delphi,soap,delphi-xe,buffer,Multithreading,Delphi,Soap,Delphi Xe,Buffer,我正在尝试实现一个调用缓冲区的函数。我的问题是功能与用户的答案有关。因此,函数可以长时间执行(由于等待用户应答),必须按以下顺序调用my函数: 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 ... 因此,函

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

  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;
或者像这样:

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是某个复杂对象的事件,每个调用实例都位于自己的线程中。所以我不能只在一个线程中执行函数


我正在开发测试程序。使用此测试程序,HumanTester模拟web服务。web服务有一个函数(
函数Transmit(text:string):string;
),它是一个Delphi web服务函数,在自己的线程中工作。当模拟web服务的人收到文本请求时,他想了很多,然后回答。但测试人员希望请求按照创建的顺序进行apear,并且只有在前一个请求得到响应后才能显示下一个请求


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

因为函数1结束后才能调用函数2,所以没有必要使用线程(事情不是并行完成的)。在我看来,你把事情搞得太复杂了。。。只需按顺序调用函数并在其中显示模态对话框即可获得用户输入。

我不能:OnAnswerRequired是一个对象事件,每次调用都位于它自己的线程中。请尝试更好地解释您需要实现什么。对我来说,当你必须以特定的顺序响应那些事件时,让线程触发事件是没有意义的——本质上你是在序列化你的线程,因此首先使用它们是没有意义的。。。哦,面向用户(GUI)的接口和多线程技术并没有很好地结合。我正在开发测试程序。使用此测试程序,HumanTester模拟web服务。Web服务有一个函数(函数Transmit(text:string):string;)(Transmit是Delphi Web服务函数,它使用自己的线程)当模拟Web服务的人收到文本请求时,他考虑了很多,然后回答。但测试人员希望请求按创建顺序显示,并且只有在前一个请求得到响应后,才能显示下一个请求。就是这样……使用FIFO队列:当web服务线程接收到请求时,它将其放入FIFO并发出“数据到达”事件的信号。主线程(GUI)读取FIFO,向用户显示请求并执行所需操作。然后它检查队列中的下一个项目,直到它为空,然后等待“数据到达”事件再次开始处理。我自己没有做过Web服务,所以我不熟悉它们的工作方式。。。我建议你发布一个新的、更好的问题——即你之前的评论(14:16)比你原来的帖子更好地描述了你的问题。