2012-06-15 7 views
5

Mam pewien rodzaj sprawdzania pisowni napisany w Delphi. Analizuje tekst zdanie po zdaniu. Powoduje zafałszowanie niewłaściwych przedmiotów według niektórych reguł po analizie każdego zdania. Użytkownik może przerwać ten proces, co jest ważne. W jaki sposób mogę zrównoleglić ten proces w ogóle za pomocą niektórych bibliotek Delphi innych firm? W obecnym stanie mam na sobie kolorowanie zdania po sprawdzeniu. W ten sposób użytkownik widzi postęp.Jak mogę zrównoleglić sprawdzanie pisowni za pomocą Delphi?

+2

Należy zauważyć, że pytanie o równoległość tego jest (lub powinno być) niezależne od biblioteki trzeciej strony. Najpierw potrzebujesz strategii, a następnie możesz zdecydować, które narzędzia zastosować, aby ją wdrożyć. – jpfollenius

+0

OK, to potrzebuję przykładu takiej strategii. Konkretne środki (takie jak bezpośrednie tworzenie wątków lub korzystanie z nich za pośrednictwem zewnętrznej biblioteki) są mniej ważne. – ilya

+1

Dlaczego musisz paraleleć sprawdzanie pisowni, który obejmuje pojedynczy ekran? –

Odpowiedz

9

Algorytm byłyby takie jak:

  • Tworzenie wielu robotników.
  • Utwórz moduł sprawdzania pisowni dla każdego pracownika.
  • Złap tekst i podziel go na jednostki pracy (słowo lub zdania). Każdej jednostce roboczej musi towarzyszyć lokalizacja w oryginalnym tekście.
  • Wysyłaj jednostki pracy do pracowników. Dobre podejście polega na wysyłaniu danych do wspólnej kolejki, z której pracownicy pobierają jednostki pracy. Kolejka musi obsługiwać wiele czytników lub musisz użyć blokowania, aby uzyskać do niej dostęp.
  • Każdy pracownik bierze jednostkę pracy, wykonuje sprawdzanie pisowni i zwraca wynik (wraz z lokalizacją w oryginalnym tekście) właścicielowi.
    • Najprostszym sposobem na zwrócenie wyniku jest wysłanie wiadomości do głównego wątku.
    • Alternatywnie można zapisać wyniki w kolejce wyników (która musi albo korzystać z blokowania, albo obsługiwać wiele programów piszących), a aplikacja może następnie odpytać te wyniki (z timera lub z programu obsługi OnIdle).

Jak wielokrotne pisowni warcaby będzie dostęp do słownika jest inny problem. Możesz załadować kopię słownika do każdego pracownika lub możesz zabezpieczyć dostęp do słownika za pomocą blokady (ale to spowolniłoby działanie). Jeśli masz szczęście, słownik jest bezpieczny dla wątków i możesz wykonywać jednoczesne zapytania bez blokowania.

Odpowiednią abstrakcją OmniThreadLibrary dla problemu będzie albo ParallelTask lub BackgroundWorker.

+2

Czy słownik nie jest prawdopodobnie przeznaczony tylko do odczytu i nie wymaga blokowania? – jpfollenius

+0

Jeszcze jeden punkt: może mógłbyś dodać kilka informacji, jak przywrócić wyniki do interfejsu użytkownika. To by uczyniło odpowiedź jeszcze lepszą. – jpfollenius

+0

Smasher, tak, masz rację, ale nie mam pojęcia, jak działa sprawdzanie pisowni. – gabr

4

Aby utworzyć równoległość, wystarczy utworzyć nową klasę potomną z TThread, utworzyć z niej obiekt, nadać część zadania nowemu wątkowi, uruchomić Execute i zebrać wyniki w głównym wątku.

Jak to:

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; 

W głównym wątku:

NewThread := TMySpellChecker.Create(True); // Create suspended 
NewThread.Text := TextSegment; 
NewThread.Execute; 

Przedmiotem wątek będzie następnie wykonać analizę w tle, podczas gdy główny wątek kontynuuje działanie.

Aby obsłużyć wyników, trzeba przypisać obsługi do zdarzenia OnTerminate obiektu wątku:

NewThread.OnTerminate := HandleMySpellCheckerTerminate; 

Należy to zrobić przed uruchomieniem Execute na obiekcie wątku.

Aby umożliwić przerwy, jedną z możliwości jest podział tekstu głównego na segmenty, umieszczenie segmentów na liście w głównym wątku, a następnie analiza segmentów jeden po drugim za pomocą obiektu z gwintem. Następnie można zezwolić na przerwy między kolejnymi uruchomieniami.