В настоящее время я работаю над небольшим редактором уценок , но у меня проблема:
Будучи очень быстрым, модуль уценки не может творить чудеса, и потомуобрабатывает весь текст каждый раз, когда что-то меняется, программа перестает отвечать на запросы, например, удерживая клавишу Backspace.
Как я могу использовать многопоточность (подпроцесс, QThread) для достижения чего-то вроде следующего?
- При изменении текста во время обработки задание помещается в очередь.Если очередь уже содержит задание, это задание заменяется новым.
- При изменении текста, когда в очереди нет задания, выполняется новое задание.
- По завершении задания, задание из очереди выполняется.Если ничего там нет, все готово.
Уточнение
Я не хочу точно описанный выше алгоритм, а скорее способ достижения постоянно, но не замедляющего типарендеринга.Я хочу запускать задания рендеринга в «фоновом режиме», но по одному, гарантируя, что всегда выполняется самое новое из возможных.
- Пользователь начинает изменять текст.
- Задание на рендеринг текущего текста запускается в другом потоке.
- Как только он заканчивается, и отрендеренный HTML заменил старый HTML, определяется, нужно ли еще делать рендеринг, т.е.самый новый текст был только что обработан или более старая версия.
- Если текст и рендеринг все еще не синхронизированы, перейдите к пункту 2.
Обратите внимание, что алгоритм выше Уточнение это способ сделать это с помощью 3. (определение асинхронности) как 1-thread-queue.Также обратите внимание, что на самом деле должна выполняться только самая новая работа, но я также хочу, чтобы случайные промежуточные задания были завершены, чтобы не допустить одновременной вставки огромного куска нового типа контента.
Наилучший сценарий: whileбыстро и непрерывно печатая на огромном документе, представление рендеринга обновляется каждые несколько слов или около того, в то время как редактор постоянно реагирует.