Nano Hash - криптовалюты, майнинг, программирование

Почему мое приложение, использующее OmniThreadLibrary Parallel.Pipeline, продолжает работать в фоновом режиме после закрытия?

Я использую OmniThreadLibrary для реализации фонового конвейера для отправки электронных писем (см. этот SO вопрос). Я заметил, что после закрытия приложения оно продолжает работать в фоновом режиме (видно в диспетчере задач Windows). Это означает, что в моем коде что-то не так с тем, как я реализовал конвейер OTL. Можете ли вы помочь мне определить неисправность?

Код следует:

unit uEmailQueue;

interface

uses Classes, OtlCommon, OtlCollections, OtlParallel, Windows;

type
  TEmailServer = record
    SMTPHost: String;
    SMTPPort: Integer;
    SMTPUseSSL: Boolean;
    SMTPUserName: String;
    SMTPPassword: String;
    SMTPSenderName: String;
  end;

  TEmailMessage = record
    RecipientEmailAddr: String;
    EmailSubject: String;
    EmailMessage: String;
  end;

  TEmailQueue = class(TObject)
  private
    FEmailServer: TEmailServer;
    FPipeline: IOmniPipeline;
    procedure SendEmailStage(const input, output: IOmniBlockingCollection);
  public
    constructor Create;
    destructor Destroy; override;
    procedure SendEmail(AEmailMessage: TEmailMessage);
  end;

implementation

{ TEmailQueue }

procedure TEmailQueue.SendEmailStage(const input, output: IOmniBlockingCollection);
var
  mailmessage: TOmniValue;
begin
  for mailmessage in input do
  begin
    Beep(3700, 1500); // just some dummy code for now
  end;
end;

constructor TEmailQueue.Create;
begin
  FPipeline := Parallel.pipeline.Stage(SendEmailStage).Run;

end;

destructor TEmailQueue.Destroy;
begin

  inherited;
end;

procedure TEmailQueue.SendEmail(AEmailMessage: TEmailMessage);
begin
  FPipeline.input.Add(TOmniValue.FromRecord(AEmailMessage));

  // FPipeline.input.CompleteAdding;

  // FPipeline.WaitFor(INFINITE);

end;

end.

Я инициализирую и вызываю вышеуказанный класс следующим образом:

В событии OnCreate основной формы приложения:

  FEmailQueue := TEmailQueue.Create;

Кнопка на главной форме имеет это в событии OnClick:

var
  em: TEmailMessage;
begin
  FEmailQueue.SendEmail(em);

позже я освобождаю класс в событии OnDestroy основной формы:

  FEmailQueue.Free;

  • procedure TEmailQueue.SendEmail(AEmailMessage: TEmailMessage); Бьюсь об заклад, это неэффективно, я думаю, вам лучше сделать EmailMessage либо в константном параметре, либо в var-параметре. 15.06.2015
  • @Arioch'Возможно. Если бы он был сделан константным, то предотвратил ли бы он (также) создание повторяющихся строк в памяти (например, var) и, следовательно, был бы быстрее? 16.06.2015
  • Нет, строки (кроме типа ShortString[nnn] TurboPascal и типа MS-COM WideString), такие как интерфейсы и dyn-массивы, являются типами с подсчетом ссылок, поэтому сами строки не должны копироваться при копировании TEmailMessage 16.06.2015
  • OTOH, Delphi после XE1 не работает. строк, поэтому я не слишком удивлюсь, если константирование параметра спасет нечто большее, чем простое копирование указателей и вызов нескольких атомарных инкрементов kazav.blogspot.ru/2014/01/delphi-2.html 16.06.2015

Ответы:


1

Вы должны позвонить FPipeline.input.CompleteAdding из TEmailQueue.Destroy. В противном случае SendEmailStage никогда не остановится.

12.06.2015
Новые материалы

Кластеризация: более глубокий взгляд
Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

Как написать эффективное резюме
Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

Частный метод Python: улучшение инкапсуляции и безопасности
Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

Как я автоматизирую тестирование с помощью Jest
Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..