2012-06-15 12 views
5

Ho una sorta di correttore ortografico scritto in Delphi. Analizza il testo frase per frase. Incorpora elementi errati secondo alcune regole dopo l'analisi di ogni frase. L'utente è in grado di interrompere questo processo, che è importante. Come posso parallelizzare questo processo in generale usando alcune librerie Delphi di terze parti? Nello stato attuale ho ottenuto la colorazione della frase al volo dopo il controllo. Quindi l'utente vede i progressi.Come posso parallelizzare il controllo ortografico usando Delphi?

+2

Si noti che la domanda su come parallelizzare questo è (o dovrebbe essere) indipendente da qualsiasi libreria di terze parti. Per prima cosa hai bisogno di una strategia, quindi puoi decidere quali strumenti utilizzare per implementarla. – jpfollenius

+0

OK, quindi ho bisogno di un esempio di tale strategia. I mezzi concreti (come la creazione diretta di thread o il loro utilizzo tramite la libreria di terze parti) sono meno importanti. – ilya

+1

Perché è necessario parallelizzare la visualizzazione di controllo ortografico di cui copre una singola schermata? –

risposta

9

L'algoritmo sarebbe in quanto tale:

  • creare più lavoratori.
  • Creare un correttore ortografico in ciascun lavoratore.
  • Prendere il testo e dividerlo in unità di lavoro (parola o frasi). Ogni unità di lavoro deve essere accompagnata con la posizione nel testo originale.
  • Invia unità di lavoro ai lavoratori. Un buon approccio è quello di inviare i dati nella coda comune da cui i lavoratori prendono le unità di lavoro. La coda deve supportare più lettori oppure è necessario utilizzare il blocco per accedervi.
  • Ogni lavoratore prende un'unità di lavoro, esegue un controllo ortografico e restituisce il risultato (insieme alla posizione nel testo originale) al proprietario.
    • Il modo più semplice per restituire un risultato è inviare un messaggio al thread principale.
    • In alternativa, è possibile scrivere i risultati in una coda di risultati (che deve utilizzare il blocco o supportare più scrittori) e l'applicazione può quindi eseguire il polling di tali risultati (da un timer o dal gestore OnIdle).

Come le molteplici ortografici saranno accedere al dizionario è un altro problema. È possibile caricare una copia del dizionario in ogni lavoratore o proteggere l'accesso al dizionario con un blocco (ma ciò rallenterebbe le cose). Se sei fortunato, il dizionario è sicuro da thread per la lettura e puoi eseguire query simultanee senza bloccare.

Un'appropriata astrazione OmniThreadLibrary per il problema potrebbe essere un ParallelTask o un BackgroundWorker.

+2

Il dizionario probabilmente non è di sola lettura e non richiede il blocco? – jpfollenius

+0

Un altro punto: potresti aggiungere alcune informazioni su come ottenere i risultati nell'interfaccia utente. Questo renderebbe la risposta ancora migliore. – jpfollenius

+0

Smasher, sì, hai un punto, ma non ho idea di come funzioni il suo controllo ortografico. – gabr

4

Per parallelizzare, basta creare un nuovo discendente di classe da TThread, creare un oggetto da esso, assegnare parte del lavoro al nuovo thread, eseguire Execute e raccogliere i risultati nel thread principale.

Ti piace questa:

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; 

nel thread principale:

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

L'oggetto thread svolgeranno poi l'analisi in background, mentre il thread principale continua a funzionare.

per gestire i risultati, è necessario assegnare un gestore per l'evento OnTerminate dell'oggetto filo:

NewThread.OnTerminate := HandleMySpellCheckerTerminate; 

Questo deve essere fatto prima di eseguire Esegui sull'oggetto thread.

Per consentire interruzioni, è possibile suddividere il testo principale in segmenti, posizionare i segmenti in un elenco nel thread principale e quindi analizzare i segmenti uno ad uno utilizzando l'oggetto thread. È quindi possibile consentire interruzioni tra ogni corsa.

Problemi correlati