Подтвердить что ты не робот

Обновить TWebBrowser в отдельном потоке?

Я использую TWebBrowser для отображения карты Google. Проблема в том, что он блокирует основной поток ui, пока он загружает карту. Возможно ли обновить карту в отдельном потоке?

Изменить: RRUZ вы правы. TWebBrowser имеет асинхронную загрузку для URL-адреса. Но я нашел проблему, почему она блокирует Вызов:

if WaitWhileProcessing and (MapQueryResult.Count > 0) then 
  Result := MapQueryResult[0] as TMapQuery;

и метод:

function TMapItemCollection.WaitWhileProcessing: Boolean;
var
  vMaxSleepCnt: Integer;
begin
  Result := True;
  vMaxSleepCnt := 0;
  while Processing or Loading do
  begin
    inc(vMaxSleepCnt);
    Application.ProcessMessages;
    Sleep(100);
    if vMaxSleepCnt = 100 then
    begin
      Result := False;
      Break;
    end;
  end;
end;

Итак, кажется, что это исправить, код должен быть реорганизован. Но это не вопрос для этого вопроса.

4b9b3361

Ответ 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 также использует основной поток пользовательского интерфейса. Это может быть и ресурсный свиньи, вызывающий голод.

Удачи!