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?
risposta
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.
Il dizionario probabilmente non è di sola lettura e non richiede il blocco? – jpfollenius
Un altro punto: potresti aggiungere alcune informazioni su come ottenere i risultati nell'interfaccia utente. Questo renderebbe la risposta ancora migliore. – jpfollenius
Smasher, sì, hai un punto, ma non ho idea di come funzioni il suo controllo ortografico. – gabr
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.
- 1. Componenti controllo ortografico per Delphi
- 2. Come posso eseguire il controllo ortografico in gVim?
- 3. Come posso usare il controllo ortografico in Rmarkdown?
- 4. Come posso integrare il controllo ortografico in Redactor?
- 5. intelligente controllo ortografico
- 6. Come abilitare il controllo ortografico in Eclipse?
- 7. Visual Studio disabilita il controllo ortografico
- 8. Come posso accedere al dizionario di controllo ortografico di Chrome?
- 9. disattiva "controllo ortografico" su textView
- 10. Quale controllo ortografico usa gedit?
- 11. docstring automatizzata e il controllo ortografico commenti
- 12. Un codice correttore ortografico in Delphi?
- 13. Eclipse - il controllo ortografico all'interno String Citazioni ""
- 14. Come abilitare il controllo ortografico del browser in CKEditor 4?
- 15. TinyMCE 4.0.5 controllo ortografico non funziona
- 16. Come parallelizzare il risolutore di Sudoku usando Grand Central Dispatch?
- 17. Come si aggiunge il controllo ortografico a un JTextArea?
- 18. Come applicare il controllo ortografico per ComboBox modificabile in WPF
- 19. Come eseguire il controllo ortografico di python docstring con emacs?
- 20. Come disabilitare il controllo ortografico per tutti i miei progetti
- 21. Come abilitare il controllo ortografico automatico di default?
- 22. Come posso eseguire il controllo ortografico di più lingue in emacs?
- 23. Controllo ortografico in scala "grande" in Python
- 24. Ignora il controllo ortografico del browser con il tuo?
- 25. Testo sublime: miglior controllo ortografico LaTeX
- 26. Specificare il percorso del file CustomDictionary per StyleCop controllo ortografico
- 27. Controllo ortografico Studio Android/Idea IntelliJ
- 28. Attivazione automatica del controllo ortografico in vimrc
- 29. Attributo controllo ortografico Textarea XHTML Strict
- 30. Evidenziamento ortografico Controllo ortografia nel browser web
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
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
Perché è necessario parallelizzare la visualizzazione di controllo ortografico di cui copre una singola schermata? –