Здравствуйте, Went, Вы писали:
W>Здравствуйте, Carc, Вы писали:
W>>>Понимаешь, если я комментирую сам вызов SetForeColor, то прокрутка дергаться прекращает.
C>>А если отключить нотификации от RichEdit на изменение на время вызовы SetForeColor? Через EM_SETEVENTMASK + ENM_CHANGE
C>>Ничего не поменяется!:!
W>Если я отключу нотификацию, то, понятное дело, ничего не будет дергаться, потому что я не буду реагировать на изменение текста и не буду запускать парсер Но если запускать его принудительно, то дергаться начнет, то есть EN_CHANGE никак не влияет.
Дык по ходу получается что дергает не сама SetForeColor, а парсер!?! Вроде как так?
У меня похожая реализация, парсится в основном потоке, но маленькими порциями (только видимая часть текста).
Но есть "но". Парсится
не сразу на всяких там EN_SELCHANGE, EN_VSCROLL (проскролили текст) или EN_CHANGE, а парсится
отложено.
Ну, если "на пальцах", в двух словах, то грубо говоря запоминается время нотификации, когда надо парсить. Взводится таймер. Когда таймер срабатывает, то проверяется время последнего события (нотификации, когда пора начинать парсить) и если таймаут прошел, тогда начинаем парсить (предполагается, что закончился активный скролл или изменение текста пользователем).
Если пока таймер "собирается" придет еще нотификация, то время прихода нотификации опять же новое и таймаут на срабатывании таймера будет меньше заданного. Тогда еще ждем, пока таймаут между последней нотификацией и срабатыванием таймера не превысит захордкоденный какой-то лимит.
Ну, это так… Принципиальная схема, так сказать. В принципе и без таймера можно. Через соседний поток, который спит-спит, нотификацией пробуждается (дергаем какой-нить примитив), ну а потом уже этот фоновый поток выполняет по сути "работу" таймера. Ну это уже детали реализации. Тут кому что нравится, кому поп, а кому попова дочка…