簡體   English   中英

如何使用Delphi並行化檢查拼寫?

[英]How can I parallelize check spelling using Delphi?

我有一種用Delphi編寫的拼寫檢查器。 它逐句分析文本。 在解析每個句子后,它根據一些規則來包含錯誤的項目。 用戶可以中斷此過程,這很重要。 如何使用某些第三方Delphi庫來一般並行化這個過程? 在目前的狀態下,我在檢查后立即着色。 因此,用戶可以看到進度。

算法如下:

  • 創建多個工人。
  • 在每個工人中創建一個拼寫檢查器。
  • 抓取文本並將其拆分為工作單位(單詞或句子)。 每個工作單位必須附有原始文本的位置。
  • 將工作單位發送給工人。 好的方法是將數據發送到工作單位的公共隊列中。 隊列必須支持多個讀取器,或者必須使用鎖定才能訪問它。
  • 每個工人都需要一個工作單元,進行拼寫檢查並將結果(連同原始文本中的位置)返回給所有者。
    • 返回結果的最簡單方法是向主線程發送消息。
    • 或者,您可以將結果寫入結果隊列(必須使用鎖定或支持多個編寫器),然后應用程序可以輪詢這些結果(來自定時器或來自OnIdle處理程序)。

多個拼寫檢查器如何訪問字典是另一個問題。 您可以在每個工作程序中加載字典的副本,或者可以使用鎖保護對字典的訪問(但這會減慢速度)。 如果幸運的話,字典對於讀取是線程安全的,您可以在不鎖定的情況下同時進行查詢。

針對該問題的適當OmniThreadLibrary抽象可以是ParallelTaskBackgroundWorker

要並行化,只需從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之前完成此操作。

為了允許中斷,一種可能性是將主文本分成段,將段放在主線程的列表中,然后使用線程對象逐個分析段。 然后,您可以允許每次運行之間的中斷。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM