Friday, February 17, 2017

OmniThreadLibrary 3.07

New year, new release ;) You can get it as a zipped download, git checkout, via Delphinus, and via GetIt.

For more information on OmniThreadLibrary, go to

New features

  • Added function IOmniPipeline.NoThrottle which disables throttling on an entire pipeline or one of its stages.
  • Added function IOmniBlockingCollection.IsFinalized.
  • Added function IOmniBlockingCollection.Count.
  • Added readonly property IOmniThreadPool.NumCores which returns number of cores this pool uses for running tasks. Changing Affinity, ProcessorGroups, or NUMANodes properties may modify this value.
  • Communication subsystem handles ERROR_NOT_ENOUGH_QUOTA (1816) error.
  • Added function IOmniBackgroundWorker.OnStop.
  • Added property IOmniWorkItem.SkipCompletionHandler.
    • If it is set to True when work item is created or during its execution, request handlers for that work item won't be called.
    • If it is set to True in the OnRequestDone_Asy handler, then only OnRequestDone handler won't be called.
  • If ThreadDataFactory.Execute throws an exception, that exception is caught, ignored and ThreadData is set to nil. [issue #88]

Bug fixes

  • Reverted change from 3.06: "Any change to Affinity, ProcessorGroups, or NUMANodes properties will reset the MaxExecuting property."
    • New behaviour is compatible with the pre-3.06 code.
      Initially, MaxExecuting is set to Environment.Process.Affinity.Count. This value can only be changed by the external code, not inside the OtlThreadPool unit.
  • In threadpool, IdleWorkerThreadTimeout_sec and WaitOnTerminate_sec were initialized too late.
  • Fixed TOmniValue.CastTo<TArray<Int64>>. [issue #89]
  • If a future's cancellation token is signalled before the future is even created, the future worker is not started at all. [issue #85]

New demos

  • examples\folder scanner: File scanning example implemented with a Pipeline.


  1. Thanks for this amazing library. We love it here.

    1. Thank you, that's good to hear. :)

  2. One of the big reasons for using Delphi! Awesome work ;-) thanks :-)

  3. Thank you very much!
    Any example of using new BackgroundWorker.StopOn function? Any idea of what it was supposed to be used for?

    1. OnStop was added as a user request and at the moment I don't have a nice example for it. If you need it, you'll find it useful, otherwise just ignore it :)

    2. Not OnStop (I think I understand what it doing), but StopOn function :)

  4. This comment has been removed by the author.