Можно ли отправлять сообщения между задачами (OmniThreadLibrary)? - PullRequest
2 голосов
/ 13 января 2011

Мое приложение будет иметь несколько задач для различных действий.
Все задачи создаются в FormCreate и завершаются в FormDestroy, они всегда выполняются, пока работает приложение.
Единственная цель основного потока состоит в том, чтобы обрабатывать пользовательский ввод-вывод и отправлять пользовательские входные данные для соответствующей задачи или получать информацию о задаче, которая должна отображаться в главной форме.

Там будут данные, которые должны быть переданы между задачами.
Пример:
У меня будет задача А, занимающаяся обработкой данных.
Некоторые результаты будут отправлены в основной поток для отображения.
Он также должен будет отправить некоторые (другие) данные в задачу B, которая передаст данные на другой ПК.
Задача C получит некоторые данные от аппаратного устройства и должна отправить эти данные для обработки задаче A.
и т.д ...

Насколько я понимаю, отправка сообщений с помощью OmniThreadLibrary всегда выполняется между задачей и потоком, который ее создал (основной поток и задача A или главный поток и задача B).

Как я могу отправлять сообщения напрямую между любыми двумя задачами?

Или есть ли проблема с моим подходом, и это должно быть сделано совершенно иначе?

1 Ответ

6 голосов
/ 13 января 2011

Возможные. Вы должны создать канал связи у владельца и передать его обеим задачам. В задаче вы затем вызываете Task.RegisterComm, чтобы зарегистрировать этот канал связи. С этого момента все сообщения, полученные на этом канале, будут отправляться с использованием стандартных механизмов OmniThreadLibrary (т.е. точно так, как если бы они были отправлены владельцем).

См. Пример 08_RegisterComm.

procedure TfrmTestRegisterComm.FormCreate(Sender: TObject);
begin
  FCommChannel := CreateTwoWayChannel(1024);
  FClient1 := CreateTask(TCommTester.Create(FCommChannel.Endpoint1))
    .Run;
  FClient2 := CreateTask(TCommTester.Create(FCommChannel.Endpoint2))
    .Run;
end;

function TCommTester.Initialize: boolean;
begin
  Task.RegisterComm(ctComm);
  Result := true;
end;
...