Потоки в Delphi XE: как реализовать буфер вызова функций? - PullRequest
2 голосов
/ 05 сентября 2011

Я пытаюсь реализовать буфер вызова функции.Моя проблема связана с функцией пользователя.Таким образом, функции могут выполняться долго (из-за ожидания ответа пользователя), и мои функции должны вызываться в следующем порядке:

  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

  ...

Поэтому функцию 2 нельзя вызывать до тех пор, пока не завершится функция 1.

Мне нужно что-то вроде этого:

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 является событием некоторого сложного объекта, и каждый вызывающий экземпляр находится в своем собственном потоке.Поэтому я не могу просто выполнять функции в одном потоке.

Я занимаюсь разработкой программы тестирования.С помощью этой программы тестирования человек-тестер эмулирует веб-сервис.Веб-сервис имеет одну функцию (function Transmit(text: string): string;), которая является функцией веб-сервиса Delphi и работает в своем собственном потоке.Когда человек, эмулирующий веб-сервис, получил текстовый запрос, он много думает и затем отвечает. Но человек-тестировщик хочет, чтобы запросы отображались в том порядке, в котором они были созданы, и следующий запрос должен отображаться только после ответа предыдущего.

Веб-сервис не имеет своего собственногонить.Вместо этого каждый раз, когда приходит запрос, Delphi выполняет функцию Transmit в потоке new .Перед выходом из функции должен быть ответ (Delphi отправит результат в soap как результат функции веб-службы).И функция не может вернуть значение результата после выхода.Так что у меня всегда будет много экземпляров функций.И проблема в том, как реализовать очередь FIFO для экземпляров функций.

1 Ответ

5 голосов
/ 05 сентября 2011

Поскольку функцию 2 нельзя вызывать до тех пор, пока не завершится функция 1, нет смысла использовать потоки (что-то не делается параллельно). Мне кажется, что вы излишне усложняете вещи ... просто вызывайте функции по очереди и показывайте модальные диалоги в них, чтобы получить пользовательский ввод.

...