如何在Delphi中编写线程数

Bri*_*ost 6 delphi file-io multithreading

我今天在Dr. Dobbs网站上发现了这个问题,网址是 http://www.ddj.com/hpc-high-performance-computing/220300055?pgno=3 这是关于线程实现的一个很好的建议.用Delphi中的TThread实现这一目标的最佳方法是什么?谢谢Brian

===来自Dobbs博士==============

使多线程可配置!程序中使用的线程数应始终可以从0(完全没有其他线程)配置为任意数字.这不仅可以实现最佳性能的定制,而且还可以证明它是一种很好的调试工具,有时候在客户端系统上出现未知竞争条件时也可以成为救星.我记得不止一种情况,客户可以通过关闭多线程来克服致命的错误.这当然不仅适用于多线程文件I/O.

考虑以下伪代码:

int CMyThreadManger::AddThread(CThreadObj theTask)
{
    if(mUsedThreadCount >= gConfiguration.MaxThreadCount())
        return theTask.Execute(); // execute task in main thread
    // add task to thread pool and start the thread
    ...
}
Run Code Online (Sandbox Code Playgroud)

这样的机制并不是很复杂(尽管可能需要的工作量比这里显示的要多一些),但它有时非常有效.它还可以与预构建的线程库一起使用,例如OpenMP或Intel的Threaded Building Blocks.考虑到此处显示的测量结果,最好包含多个可配置的线程计数(例如,一个用于文件I/O,一个用于核心CPU任务).对于CPU任务,文件I/O和< 找到的核心数 > 的默认值可能为0 .但是所有多线程都应该是可拆卸的.更复杂的方法甚至可能包括一些代码来测试多线程性能并设置自动使用的线程数,甚至可以单独用于不同的任务.

===================

Too*_*the 5

我会创建一个抽象类TTask.此类用于执行任务.使用Execute方法:

type

  TTask = abstract class
  protected
    procedure DoExecute; virtual; abstract;
  public
    procedure Execute;
  end;

  TTaskThread = class (TThread)
  private
    FTask : TTask;
  public
    constructor Create(const ATask: TTask); 
    // Assigns FTask and enables thread, free on terminate.

    procedure Execute; override; // Calls FTask.Execute.
 end;
Run Code Online (Sandbox Code Playgroud)

Execute方法检查线程数.如果未达到max,则使用调用DoExecute的TTaskThread启动一个线程,并因此在线程中执行该任务.如果达到最大值,则直接调用DoExecute.


Sti*_*ers 0

我通常只有一个继承自 TThread 的类,该类从队列或堆栈中获取“工作项”,并在没有更多项可用时让它们挂起。然后主程序可以决定要实例化和启动该线程的多少个实例。(使用此配置值)。

当工作项排队或线程完成处理工作项时,此“工作项队列”还应该足够智能,能够在需要时(并且在限制允许的情况下)恢复挂起的线程或创建新线程。

  • 根本不需要挂起和恢复线程。让每个线程等待一个事件或信号量,或者使用带有线程消息循环的“WaitMessage()”(对于 OLE 可能是必需的)。在 [delphi] 下的 SO 上有很多关于该主题的讨论,请阅读它,但最好忽略那些认为自己比 Embarcadero 和 Microsoft 开发人员更了解的人的论点,并尝试使用 `Suspend()` 来告诉您和 `Resume()` 就可以了。 (5认同)