标签: omnithreadlibrary

OmniThreadLibrary概述

有没有对Delphi的OmniThreadLibray进行介绍性概述的地方?

我在Delphi XE中安装了当前代码.这些例子很有用.我一直在查看相关的Delphi Geek博客以及用法示例.Gabr承认文档不存在.在深入了解具体示例之前,我想了解一下框架的结构.我对TThread的使用有了解,所以我不需要去一个线程101网站.

该框架已表明有忠诚的追随者,我想我只是没有找到正确的地方.

delphi delphi-xe omnithreadlibrary

20
推荐指数
1
解决办法
1063
查看次数

如何实现使用最少资源定期检查某些内容的线程?

我想在后台运行一个线程,它将以给定的时间间隔检查与某个服务器的连接.例如每5秒.

我不知道这是否有一个好的"设计模式"?如果我记得正确的话,我已经读过一些在其执行方法中睡眠线程不好的地方.但我可能错了.

另外,我可以使用普通的TThread类或OTL线程库.

有任何想法吗?

谢谢.

delphi multithreading tthread delphi-2009 omnithreadlibrary

13
推荐指数
2
解决办法
2476
查看次数

Delphi - 线程框架

我正在寻找一个在我的Delphi应用程序中使用的线程框架.

目前我正在评估' OmniThreadLibrary ' - 到目前为止它看起来很好并且做我需要的一切.

Delphi还有其他"线程框架"吗?

(我正在使用D2006和D2009)

delphi multithreading frameworks omnithreadlibrary

12
推荐指数
2
解决办法
3965
查看次数

将多线程Delphi应用程序移植到Mac:我的选择是什么?

我需要将应用程序(用XE2编写)移植到Mac.

我的应用程序分为简单UI executable(单线程)和不可见engine(严重依赖于OmniThreadLibrary 3.02Cromis DirectoryWatch)

两个EXE都通过Cromis.IPC进行通信

这就是说我主要有这3个组件的问题(OmniThreadLibrary,Cromis IPC和DirectoryWatch)

我现在关注的是引擎,其中包含大部分代码.

我的问题是:是否有类似于OmniThreadLibrary,Cromis DirectoryWatch和Cromis.IPC for Mac?(无论是使用lazarus还是使用XE2作为目标编译器)

答案将帮助我很多决定我是否应该使用Delphi XE2或拉撒路(一个IDE这我不熟悉所有用),看看有什么提供/以最小的头痛同时支持Windows和Mac的最好的长期的办法

delphi macos lazarus delphi-xe2 omnithreadlibrary

12
推荐指数
1
解决办法
1038
查看次数

为什么使用IOmniThreadPool的以下代码会导致访问冲突?

在我们的Delphi XE4应用程序中,我们使用具有MaxExecuting = 4的OmniThreadPool来提高某个计算的效率.不幸的是,我们遇到了间歇性访问违规问题(例如,参见下面的MadExcept错误报告http://ec2-72-44-42-247.compute-1.amazonaws.com/BugReport.txt).我能够构建以下示例来演示该问题.运行以下控制台应用程序后,System.SyncObjs.TCriticalSection.Acquire中的访问冲突通常会在一分钟左右内发生.任何人都可以告诉我在下面的代码中我做错了什么,或者告诉我另一种方法来实现预期的结果?

program OmniPoolCrashTest;

{$APPTYPE CONSOLE}

uses
  Winapi.Windows, System.SysUtils,
  DSiWin32, GpLists,
  OtlSync, OtlThreadPool, OtlTaskControl, OtlComm, OtlTask;

const
  cTimeToWaitForException = 10 * 60 * 1000;  // program exits if no exception after 10 minutes
  MSG_CALLEE_FINISHED = 113; // our custom Omni message ID
  cMaxAllowedParallelCallees = 4; // enforced via thread pool
  cCalleeDuration = 10; // 10 miliseconds
  cCallerRepetitionInterval = 200; // 200 milliseconds
  cDefaultNumberOfCallers = 10; // 10 callers each issuing 1 call every 200 milliseconds

var …
Run Code Online (Sandbox Code Playgroud)

delphi access-violation threadpool omnithreadlibrary

10
推荐指数
2
解决办法
576
查看次数

为什么我需要在我的Delphi dll中使用Sharemem,它只使用WideString参数公开一个函数?

我有一个用Delphi编写的dll和测试应用程序.测试应用程序使用多个线程来调用dll导出的函数.导出的函数具有简单的线程安全实现.运行测试应用程序时会发生各种错误(访问冲突,无效指针操作,堆栈溢出等)或应用程序冻结.在某些情况下,应用程序完成没有错误.

请注意,这些错误仅在使用多个线程时发生(表面).从主线程调用函数时,一切正常.

我发现将ShareMem添加到dll和应用程序会停止所有这些错误.但我不明白为什么.据我所知,只有在dll和应用程序之间传递长字符串时才需要ShareMem.据我所知,WideString不是一个长字符串.

另外根据这篇文章,不应该要求ShareMem: 为什么Delphi DLL可以在不使用ShareMem的情况下使用WideString?

这是dll的来源:

library External;

uses
  Winapi.Windows;

type
  TMyType = class
  private
    FText: string;
  end;

function DoSomething(input: WideString; out output: WideString): Bool; stdcall;
var
  x: TObject;
begin
  x := TMyType.Create;
  try
    output := x.ClassName;
  finally
    x.Free;
  end;
  Result := True;
end;

exports
  DoSomething;
begin
end.
Run Code Online (Sandbox Code Playgroud)

这是测试应用程序:

program ConsoleTest;

{$APPTYPE CONSOLE}

uses
  System.SysUtils,
  Winapi.Windows,
  OtlParallel;

function DoSomething(input: WideString; out output: WideString): Bool; stdcall; external 'External.dll' name 'DoSomething';

var
  sResult: WideString;

begin
  try
    Parallel.&For(0, 500).Execute(procedure(value: Integer)
    var
      sResult: …
Run Code Online (Sandbox Code Playgroud)

delphi dll multithreading widestring omnithreadlibrary

9
推荐指数
1
解决办法
306
查看次数

适用于iOS/Android/OSX的OmniThread替代品?

iOS/Android/OSX下有OmniThread的替代品吗?

它不需要像OmniThread一样完整,我只需要能够拥有线程池和TFuture <>类.

谢谢!

更新:Delphi XE7现在在System.Threading中实现Future/Parallel/Task.

delphi omnithreadlibrary firemonkey

6
推荐指数
0
解决办法
490
查看次数

如何使用Delphi和OmniThread将文件上传到背景中?

我试图用Delphi将+100文件上传到azure.但是,调用会阻塞主线程,因此我想通过异步调用或后台线程来执行此操作.

这就是我现在所做的事情(如此处所述):

procedure TCloudManager.UploadTask(const input: TOmniValue;
  var output: TOmniValue);
var
  FileTask:TFileTask;
begin
  FileTask := input.AsRecord<TFileTask>;

  Upload(FileTask.BaseFolder, FileTask.LocalFile, FileTask.CloudFile);
end;

function TCloudManager.MassiveUpload(const BaseFolder: String;
  Files: TDictionary<String, String>): TStringList;
var
  pipeline: IOmniPipeline;
  FileInfo : TPair<String,String>;
  FileTask:TFileTask;
begin
  // set up pipeline
  pipeline := Parallel.Pipeline
    .Stage(UploadTask)
    .NumTasks(Environment.Process.Affinity.Count * 2)
    .Run;
  // insert URLs to be retrieved
  for FileInfo in Files do
  begin
    FileTask.LocalFile := FileInfo.Key;
    FileTask.CloudFile := FileInfo.Value;
    FileTask.BaseFolder := BaseFolder;

    pipeline.Input.Add(TOmniValue.FromRecord(FileTask));
  end;//for

  pipeline.Input.CompleteAdding;

  // wait for pipeline to complete
  pipeline.WaitFor(INFINITE); …
Run Code Online (Sandbox Code Playgroud)

delphi multithreading azure delphi-xe2 omnithreadlibrary

5
推荐指数
1
解决办法
1142
查看次数

OmnithreadLibrary是否支持"偷工作"?

例如,工作窃取在Java平台上的Fork/Join框架中可用.(请参阅fork/join框架如何比线程池更好?) - 与OmniThreadLibrary类似吗?


工作窃取:用尽线索的工作线程可以从其他忙碌的线程中窃取任务.

delphi fork-join omnithreadlibrary

5
推荐指数
1
解决办法
339
查看次数

如何从第二个线程更新进度指示器?

我有一个带有进度指示器的主表单.在数据模块中,我有十个数据集,每个数据集都定义了一个OnBeforeOpen事件.

我想通过主窗体中的进度条显示打开的数据集的进度百分比.

由于我对多线程编程完全不熟悉,有人可以给我一些建议吗?

非常感谢你

delphi omnithreadlibrary

5
推荐指数
1
解决办法
7259
查看次数