相关疑难解决方法(0)

如何在Delphi中以各种方式选择线程?

看来我终于要在我的Delphi 2009程序中实现某种线程.如果只有一种方法可以做到这一点,我就会开始跑步.但我看到了几种可能性.

任何人都可以解释这些之间的差异以及为什么我选择一个而不是另一个.

  1. Delphi中的TThread类

  2. AsyncCalls安德烈亚斯Hausladen

  3. OmniThreadLibrary by Primoz Gabrijelcic(gabr)

  4. ......还有其他人吗?


编辑:

我刚读了Gabr在2010年3月(第10期)Blaise Pascal杂志上发表的一篇精彩文章,名为"创造线索的四种方法".你必须订阅获取杂志的内容,所以根据版权,我不能在这里重现任何实质性的内容.

总之,Gabr描述了使用TThreads,直接Windows API调用,Andy的AsyncCalls和他自己的OmniThreadLibrary之间的区别.他的结论是:

"我不是说你必须选择除了经典的德尔福方式(TThread)以外的任何东西,但是你知道你拥有的选择仍然很好"

Mghie的答案非常透彻,暗示OmniThreadLibrary可能更可取.但是我仍然对每个人关于我(或任何人)应该如何为他们的应用选择他们的线程方法的意见感兴趣.

您可以添加到列表中:

.4.直接调用Windows API

.5. 米莎Charrett的 CSI分布式应用程序框架,通过LachlanG在答复建议.


结论:

我可能会选择OmniThreadLibrary.我喜欢加布尔的作品.我多年前使用过他的探查器GPProfile,而我现在正在使用他的GPStringHash,它实际上是OTL的一部分.

一旦Embarcadero将该功能添加到Delphi中,我唯一关心的可能就是升级它以使用64位或Unix/Mac处理.

delphi multithreading asynchronous

63
推荐指数
4
解决办法
6698
查看次数

TThreadedQueue不具备多个消费者的能力?

尝试在单个生产者多个消费者方案中使用TThreadedQueue(Generics.Collections).(DELPHI-XE).我们的想法是将对象推入队列,让几个工作线程排空队列.

但它没有按预期工作.当两个或多个工作线程调用PopItem时,将从TThreadedQueue抛出访问冲突.

如果对PopItem的调用是使用临界区序列化的,那么一切都很好.

当然,TThreadedQueue应该能够处理多个消费者,所以我错过了什么或者这是TThreadedQueue中的一个纯粹的错误?

这是一个产生错误的简单示例.

program TestThreadedQueue;

{$APPTYPE CONSOLE}

uses
//  FastMM4 in '..\..\..\FastMM4\FastMM4.pas',
  Windows,
  Messages,
  Classes,
  SysUtils,
  SyncObjs,
  Generics.Collections;

type TThreadTaskMsg =
       class(TObject)
         private
           threadID  : integer;
           threadMsg : string;
         public
           Constructor Create( ID : integer; const msg : string);
       end;

type TThreadReader =
       class(TThread)
         private
           fPopQueue   : TThreadedQueue<TObject>;
           fSync       : TCriticalSection;
           fMsg        : TThreadTaskMsg;
           fException  : Exception;
           procedure DoSync;
           procedure DoHandleException;
         public
           Constructor Create( popQueue : TThreadedQueue<TObject>;
                               sync     : TCriticalSection);
           procedure Execute; override;
       end;

Constructor TThreadReader.Create( popQueue : …
Run Code Online (Sandbox Code Playgroud)

delphi queue delphi-xe delphi-xe2

43
推荐指数
2
解决办法
5994
查看次数

使用Delphi掌握多线程需要哪些核心原则?

我对编程很新(大约8个月在Delphi中打开和关闭,在这里和那里有一点点Python)我正在购买一些书籍.

我有兴趣学习并发编程和使用Delphi构建多线程应用程序.每当我搜索"多线程Delphi"或"Delphi多线程教程"时,我似乎都会得到相互矛盾的结果,因为有些东西是关于使用某些库(Omnithread库)而其他东西似乎更适合具有更多经验的程序员.

我已经研究了很多关于德尔福的书籍,并且在很大程度上它们似乎有点撇开表面并且没有真正深入研究这个主题.我有一个程序员(他使用c ++)的朋友,他建议我在使用线程时学习底层系统的实际情况,而不是首先在我的程序中跳转到如何实际实现它们.

在Amazon.com上有很多关于并发编程的书籍,但似乎没有一本书是用Delphi制作的.

基本上我需要知道在开始使用线程之前我应该​​专注于学习的主要内容,如果我能够/应该尝试使用并非专门针对Delphi开发人员的书籍来学习它们(不想混淆自己阅读现在有很多其他语言代码示例的书籍,如果有关于这个主题的任何可靠的资源/书籍,这里的任何人都可以推荐.

delphi multithreading

15
推荐指数
3
解决办法
3053
查看次数

需要多线程内存管理器

我将不得不创建一个多线程项目很快我看到实验(delphitools.info/2011/10/13/memory-manager-investigations)显示默认的Delphi内存管理器存在多线程问题.

在此输入图像描述

所以,我找到了这个SynScaleMM.有人可以给它或类似的内存管理器提供一些反馈吗?

谢谢

delphi delphi-xe

14
推荐指数
2
解决办法
7100
查看次数

Delphi - 线程框架

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

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

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

(我正在使用D2006和D2009)

delphi multithreading frameworks omnithreadlibrary

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