我今天在 Dr Dobbs 网站上发现了这个: http://www.ddj.com/hpc-high-performance-computing/220300055?pgno=3 这是关于线程实现的一个很好的建议。 我想知道在 Delphi 中使用 TThread 实现此目的的最佳方法是什么? 谢谢 布赖恩
===来自多布斯博士=============
使多线程可配置!程序中使用的线程数应始终可配置,从 0(根本没有附加线程)到任意数。这不仅允许定制以获得最佳性能,而且还被证明是一个很好的调试工具,有时在客户端系统上发生未知竞争条件时可以成为救星。我记得不止一种情况,客户能够通过关闭多线程来克服 fatal error 。这当然不仅仅适用于多线程文件 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
...
}
这样的机制并不是很复杂(尽管可能需要比这里显示的更多的工作),但有时它非常有效。它还可以与预构建的线程库(例如 OpenMP 或 Intel 的线程构建 block )一起使用。考虑到此处显示的测量结果,最好包含多个可配置线程计数(例如,一个用于文件 I/O,一个用于核心 CPU 任务)。文件 I/O 的默认值可能为 0,CPU 任务的默认值可能为 0。但所有的多线程都应该是可分离的。更复杂的方法甚至可能包括一些代码来测试多线程性能并设置自动使用的线程数,甚至可能单独针对不同的任务。
====================
最佳答案
我将创建一个抽象类 TTask。该类旨在执行任务。使用方法执行:
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;
方法 Execute 检查线程数。如果未达到最大值,它将使用 TTaskThread 启动一个线程,调用 DoExecute 并因此在线程中执行任务。如果达到最大值,则直接调用DoExecute。
关于multithreading - 如何在 Delphi 中编程线程数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1491868/