Ответ 1
Когда выполняется оператор if и вызывает WaitWhileProcessing для оценки состояния, он циклически выполняет 100 раз с 10-м секундным сном. Но какие сообщения ждут при вызове ProcessMessages? Может ли метод снова вызываться рекурсивно? Он никогда не попадет во сне, но продолжает использовать этот метод. Кстати, имейте в виду, что ProcessMessages - действительно плохая практика, но на данный момент... попробуйте следующее:
var
isWaitWhileProcessingBusy :boolean = false;
function TMapItemCollection.WaitWhileProcessing: Boolean;
var
vSleepCnt: Integer;
begin
if not isWaitWhileProcessingBusy then
begin
isWaitWhileProcessingBusy = true;
vSleepCnt := 0;
while Processing or Loading or vSleepCnt < 100 do
begin
inc(vSleepCnt);
Application.ProcessMessages;
Sleep(100);
end;
isWaitWhileProcessingBusy := false;
end;
Result = Processing or Loading;
end;
Как вы можете видеть, я также изменил некоторые другие незначительные вещи. Разрыв не находится в состоянии while, и результат является просто результатом обработки или загрузки (поскольку это выражение дает фактический результат). Дополнительный isWaitWhileProcessingBusy вне функции сохраняет повторный ввод цикла сообщения. Надеемся, что это предотвратит блокировку пользовательского интерфейса. Это также не лучшая практика, но на данный момент это может помочь решить проблему, и с ней точно определить проблему.
Есть ли причина, по которой вы опросили загрузку/обработку? Не было бы намного проще использовать событие OnDocumentComplete для TWebBrowser?
... и другая мысль перешла мне в голову... Вы проверили менеджера задач? Карты google используют flash, компонент activex также использует основной поток пользовательского интерфейса. Это может быть и ресурсный свиньи, вызывающий голод.
Удачи!