【问题标题】:Delphi XE threading: how to realize function calling buffer?Delphi XE线程:如何实现函数调用缓冲区?
【发布时间】:2011-09-05 07:50:54
【问题描述】:

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

  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队列。

【问题讨论】:

    标签: multithreading delphi soap delphi-xe buffer


    【解决方案1】:

    由于直到函数 1 结束才能调用函数 2,所以没有必要使用线程(事情不是并行完成的)。对我来说,您似乎使事情变得不必要地复杂化...只需按顺序调用函数并在其中显示模态对话框以获取用户输入。

    【讨论】:

    • 我不能:OnAnswerRequired 是一个对象事件,它的每次调用都位于它自己的线程中。
    • 请尝试更好地解释您需要实现的目标。对我来说,当您必须以特定顺序响应这些事件时,让线程触发事件是没有意义的 - 本质上是您正在序列化您的线程,因此首先使用它们没有意义......哦,并且与用户(GUI)和多线程交互并不能很好地混合。
    • 我正在开发测试程序。使用此测试程序,人工测试人员可以模拟 Web 服务。 Web-service 有一个函数 (function Transmit(text : string): string;) (Transmit 是 Delphi web-service 函数,使用自己的线程) 当人类模拟 web-service 收到文本请求时,他想了很多,然后答案。但是人类测试人员希望请求按创建顺序出现,并且下一个请求必须仅在前一个请求被回答后才显示。就是这样....
    • 使用 FIFO 队列:当 Web 服务线程接收到请求时,它会将请求放入 FIFO 并发出“数据到达”事件的信号。主线程 (GUI) 从 FIFO 中读取数据,向用户显示请求并执行所需的操作。然后它检查队列中的下一个项目,直到它为空,然后等待“数据到达”事件再次开始处理。
    • 我自己没有做过网络服务,所以我不熟悉它们是如何工作的......我建议你发布一个新的、更好的问题 - 即你之前的评论(在 14:16)要好得多你的问题的描述比你原来的帖子。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-04-02
    • 1970-01-01
    • 2011-06-08
    • 1970-01-01
    • 1970-01-01
    • 2013-03-12
    • 1970-01-01
    相关资源
    最近更新 更多