multithreading - Delphi XE线程: how to realize function calling buffer?

标签 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 都会在新线程中执行 Transmit 函数。在函数退出之前,必须有一个答案(Delphi 将在soap 中发送结果作为Web 服务函数的结果)。并且函数退出后无法返回结果值。所以我总是会有很多函数的实例。问题是如何实现函数实例的先进先出队列。

最佳答案

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

关于multithreading - Delphi XE线程: how to realize function calling buffer?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7305216/

相关文章:

python - 如何在不阻塞 Python 应用程序的情况下运行一段代码?

sql-server - 使用 SSL 加密连接到 SQL Server

web-services - 是否有命名 SOAP 接口(interface)方法和变量的最佳实践?

php - 未捕获的 soapfault 异常

php - 如何使用 Swift 解析 iOS 中包含复杂类型的 SOAP 响应?

c++ - 在qt中创建另一个网络线程

c - 分支与多线程

c++ - C++ 中的线程安全单例使用静态成员实例(无惰性实例化)

delphi - 无效的浮点运算

sql - 我应该创建表还是查询?