如何使用Delphi并行检查拼写?

如何使用Delphi并行检查拼写?,delphi,parallel-processing,spell-checking,Delphi,Parallel Processing,Spell Checking,我有一种用Delphi写的拼写检查程序。它逐句分析文本。 在分析每个句子后,它会根据一些规则对错误的项目进行编码。用户可以中断此过程,这一点很重要。 一般来说,如何使用一些第三方Delphi库来并行化这个过程? 在当前状态下,我在检查后得到了即时语句着色。因此,用户可以看到进度。算法如下: 创建多个工人 在每个工人中创建一个拼写检查器 抓取文本并将其拆分为工作单元(单词或句子)。每个工作单元必须附有原始文本中的位置 把工作单位发给工人。好的方法是将数据发送到工人从中获取工作单元的公共队列中。队

我有一种用Delphi写的拼写检查程序。它逐句分析文本。 在分析每个句子后,它会根据一些规则对错误的项目进行编码。用户可以中断此过程,这一点很重要。 一般来说,如何使用一些第三方Delphi库来并行化这个过程?
在当前状态下,我在检查后得到了即时语句着色。因此,用户可以看到进度。

算法如下:

  • 创建多个工人
  • 在每个工人中创建一个拼写检查器
  • 抓取文本并将其拆分为工作单元(单词或句子)。每个工作单元必须附有原始文本中的位置
  • 把工作单位发给工人。好的方法是将数据发送到工人从中获取工作单元的公共队列中。队列必须支持多个读卡器,或者必须使用锁定来访问它
  • 每个工作人员获取一个工作单元,运行拼写检查并将结果(连同原始文本中的位置)返回给所有者。
    • 返回结果的最简单方法是向主线程发送消息
    • 或者,您可以将结果写入结果队列(必须使用锁定或支持多个写入程序),然后应用程序可以轮询这些结果(从计时器或OnIdle处理程序)
多个拼写检查器如何访问字典是另一个问题。您可以在每个worker中加载字典的副本,也可以使用锁保护对字典的访问(但这会减慢速度)。如果幸运的话,字典是线程安全的,可以在不锁定的情况下进行同步查询


对于这个问题,合适的OmniThreadLibrary抽象应该是a或a。

要并行化,只需从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;
然后,线程对象将在后台进行分析,而主线程将继续运行

要处理结果,需要为thread对象的OnTerminate事件分配一个处理程序:

NewThread.OnTerminate := HandleMySpellCheckerTerminate;
这必须在对线程对象运行Execute之前完成


为了允许中断,一种可能是将主文本分成多个段,将这些段放在主线程的列表中,然后使用thread对象逐个分析这些段。然后,您可以在每次运行之间允许中断。

请注意,如何并行化这个问题独立于(或应该独立于)任何第三方库。您首先需要一个策略,然后您可以决定使用哪些工具来实现它。为什么您需要将覆盖单个屏幕的拼写检查显示并行化?如果您仍然希望执行线程化(在阅读Davids valid question之后),并且您是线程化新手,请不要自己动手。使用OmnithreadLibrary(OTL)。并行并不能解决速度慢的问题。你必须对算法进行优化,因为如果用户不得不等待太多时间,算法将无法使用。重要的一点是,请澄清是否在文本更改时或通过用户命令调用拼写检查器。字典不可能是只读的,不需要锁定吗?还有一点:也许您可以添加一些有关如何将结果返回到UI的信息。这会让答案更好。斯玛瑟,是的,你说得有道理,但我不知道他的拼写检查是如何工作的。字典是只读的。事实上,该工具不是一个基本的拼写检查工具,但它也使用字典。这个工具检查专门的语法,这就是为什么它在句子上下文中工作的原因。@gabr OmniThreadLibrary从2007年版本起就支持Delphi。但我必须使用古老的德尔菲7。关于这个非gui库,7和2007之间有什么区别?