Re[7]: ITextFont::SetForeColor дергает полосу прокрутки
От: Carc Россия http://www.amlpages.com/home.php
Дата: 24.08.20 07:23
Оценка:
Здравствуйте, Went, Вы писали:

W>Здравствуйте, Carc, Вы писали:


W>>>Понимаешь, если я комментирую сам вызов SetForeColor, то прокрутка дергаться прекращает.

C>>А если отключить нотификации от RichEdit на изменение на время вызовы SetForeColor? Через EM_SETEVENTMASK + ENM_CHANGE
C>>Ничего не поменяется!:!
W>Если я отключу нотификацию, то, понятное дело, ничего не будет дергаться, потому что я не буду реагировать на изменение текста и не буду запускать парсер Но если запускать его принудительно, то дергаться начнет, то есть EN_CHANGE никак не влияет.
Дык по ходу получается что дергает не сама SetForeColor, а парсер!?! Вроде как так?
У меня похожая реализация, парсится в основном потоке, но маленькими порциями (только видимая часть текста).

Но есть "но". Парсится не сразу на всяких там EN_SELCHANGE, EN_VSCROLL (проскролили текст) или EN_CHANGE, а парсится отложено.

Ну, если "на пальцах", в двух словах, то грубо говоря запоминается время нотификации, когда надо парсить. Взводится таймер. Когда таймер срабатывает, то проверяется время последнего события (нотификации, когда пора начинать парсить) и если таймаут прошел, тогда начинаем парсить (предполагается, что закончился активный скролл или изменение текста пользователем).

Если пока таймер "собирается" придет еще нотификация, то время прихода нотификации опять же новое и таймаут на срабатывании таймера будет меньше заданного. Тогда еще ждем, пока таймаут между последней нотификацией и срабатыванием таймера не превысит захордкоденный какой-то лимит.

Ну, это так… Принципиальная схема, так сказать. В принципе и без таймера можно. Через соседний поток, который спит-спит, нотификацией пробуждается (дергаем какой-нить примитив), ну а потом уже этот фоновый поток выполняет по сути "работу" таймера. Ну это уже детали реализации. Тут кому что нравится, кому поп, а кому попова дочка…
Aml Pages Home
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.