-
Добрый день, уважаемые мастера! Возникла проблема, пишу плагин IE для работы с конкретным сайта. Сайт имеет фреймовую структуру. Задача - точно отслеживать загрузку каждого фрейма и потом делать бработку его содержимого. Что делаю ... подцепляю на IE обработчик собитий DWebBrowserEvents в итоге, могу отслеживать: FrameBeforeNavigate, FrameNavigateComplete ... вроде бы всё и хорошо, но FrameNavigateComplete срабатывает как только фрейм получает первую порцию данных, а не как хотелось бы, всю сраницу)) Решил после наступления FrameNavigateComplete отслеживать свойство readyState фрейма. Как бы оно есть у каждого фрейма и по идее срабатывает именно тогда, когда окумент полностью загружен - принимает значение "complete", пока грузится - "loading" или "interactive". Не нашёл ничего лучше, как в обработчике FrameNavigateComplete написать while IDoc.readyState <> 'complete' do Application.ProcessMessages; (где IDoc - документ фрейма типа IHTMLDocument2) Обычно это помогает дождаться какого-то события, а тут возникает проблема - после запуска этого цикла IE виснет, т.е. Application.ProcessMessages хоть в цикле и вызывается, но ничего не даёт, всё равно на этом цикле IE перестаёт выполнять все действия и IDoc.readyState так и остаётся равным "interactive" ... висим в итоге ... Помогите пожалуйста, в чём тут проблема и как её можно решить? Спасибо!
-
проблемы я в принципе уже понял ... цикл while IDoc.readyState <> 'complete' do Application.ProcessMessages; вызывается внутри function TEventSink.Invoke, т.е. внутри функции, вызываемой IE, для оповещения моего приложения о том, что произошло какое-то событие и этот цикл "заклинивает" TEventSink.Invoke, а IE не продолжает ничего делать пока TEventSink.Invoke не выполнится полностью, другого объяснения найти не могу ... вопрос, есть ли какая-то возможность обойти это подвисание? пока тупо приходится обработать событие и передавать его в таймер))) там while IDoc.readyState <> 'complete' do Application.ProcessMessages; выполняется без проблем и ничего не вешает) а подругому никак, без таймера?))
|