有没有对Delphi的OmniThreadLibray进行介绍性概述的地方?
我在Delphi XE中安装了当前代码.这些例子很有用.我一直在查看相关的Delphi Geek博客以及用法示例.Gabr承认文档不存在.在深入了解具体示例之前,我想了解一下框架的结构.我对TThread的使用有了解,所以我不需要去一个线程101网站.
该框架已表明有忠诚的追随者,我想我只是没有找到正确的地方.
我想在后台运行一个线程,它将以给定的时间间隔检查与某个服务器的连接.例如每5秒.
我不知道这是否有一个好的"设计模式"?如果我记得正确的话,我已经读过一些在其执行方法中睡眠线程不好的地方.但我可能错了.
另外,我可以使用普通的TThread类或OTL线程库.
有任何想法吗?
谢谢.
我正在寻找一个在我的Delphi应用程序中使用的线程框架.
目前我正在评估' OmniThreadLibrary ' - 到目前为止它看起来很好并且做我需要的一切.
Delphi还有其他"线程框架"吗?
(我正在使用D2006和D2009)
我需要将应用程序(用XE2编写)移植到Mac.
我的应用程序分为简单UI executable
(单线程)和不可见engine
(严重依赖于OmniThreadLibrary 3.02和Cromis DirectoryWatch)
两个EXE都通过Cromis.IPC进行通信
这就是说我主要有这3个组件的问题(OmniThreadLibrary,Cromis IPC和DirectoryWatch)
我现在关注的是引擎,其中包含大部分代码.
我的问题是:是否有类似于OmniThreadLibrary,Cromis DirectoryWatch和Cromis.IPC for Mac?(无论是使用lazarus还是使用XE2作为目标编译器)
答案将帮助我很多决定我是否应该使用Delphi XE2或拉撒路(一个IDE这我不熟悉所有用),看看有什么提供/以最小的头痛同时支持Windows和Mac的最好的长期的办法
在我们的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编写的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) iOS/Android/OSX下有OmniThread的替代品吗?
它不需要像OmniThread一样完整,我只需要能够拥有线程池和TFuture <>类.
谢谢!
更新:Delphi XE7现在在System.Threading中实现Future/Parallel/Task.
我试图用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) 例如,工作窃取在Java平台上的Fork/Join框架中可用.(请参阅fork/join框架如何比线程池更好?) - 与OmniThreadLibrary类似吗?
工作窃取:用尽线索的工作线程可以从其他忙碌的线程中窃取任务.
我有一个带有进度指示器的主表单.在数据模块中,我有十个数据集,每个数据集都定义了一个OnBeforeOpen事件.
我想通过主窗体中的进度条显示打开的数据集的进度百分比.
由于我对多线程编程完全不熟悉,有人可以给我一些建议吗?
非常感谢你
delphi ×10
delphi-xe2 ×2
azure ×1
delphi-2009 ×1
delphi-xe ×1
dll ×1
firemonkey ×1
fork-join ×1
frameworks ×1
lazarus ×1
macos ×1
threadpool ×1
tthread ×1
widestring ×1