【发布时间】: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