我有一种用Delphi编写的拼写检查程序。它逐句分析文本。 在解析每个句子后,它根据一些规则来包含错误的项目。用户可以中断此过程,这很重要。 如何使用某些第三方Delphi库来一般并行化这个过程? 在目前的状态下,我在检查后立即着色。因此,用户可以看到进度。
答案 0 :(得分:9)
算法如下:
多个拼写检查器如何访问字典是另一个问题。您可以在每个工作程序中加载字典的副本,或者可以使用锁保护对字典的访问(但这会减慢速度)。如果幸运的话,字典对于读取是线程安全的,您可以在不锁定的情况下同时进行查询。
针对该问题的适当OmniThreadLibrary抽象可以是ParallelTask或BackgroundWorker。
答案 1 :(得分:4)
要并行化,只需从TThread创建一个新的类后代,从中创建一个对象,将部分作业提供给新线程,运行Execute,并在主线程中收集结果。
像这样:
TMySpellChecker = class(TThread)
protected
FText: String;
FResult: String;
public
procedure Execute; override;
property Text: String read FText write FText;
property Result: String read FResult write FResult;
end;
TMySpellChecker.Execute;
begin
// Analyze the text, and compute the result
end;
在主线程中:
NewThread := TMySpellChecker.Create(True); // Create suspended
NewThread.Text := TextSegment;
NewThread.Execute;
然后线程对象将在后台进行分析,同时主线程继续运行。
要处理结果,您需要为线程对象的OnTerminate事件分配处理程序:
NewThread.OnTerminate := HandleMySpellCheckerTerminate;
必须在对线程对象运行Execute之前完成此操作。
为了允许中断,一种可能性是将主文本分成段,将段放在主线程的列表中,然后使用线程对象逐个分析段。然后,您可以允许每次运行之间的中断。