Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > [ "Начинающим" ]
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 27.05.2012, 11:29
Pcrepair
 
Сообщения: n/a
По умолчанию Application.ProcessMessages и загрузка процессора

Добрый день
Замечено, что в момент загрузки страницы ПРОЦ грузит до 50% видимо в первом Application.ProcessMessages

Код:
try
        Wbbr.Navigate(UrlSearch, Flags, TargetFrameName, PostData, Headers);
          repeat
            Application.ProcessMessages; (*видимо тут грузит проц до 50%*)
          until Wbbr.ReadyState >= READYSTATE_COMPLETE;
          if Wbbr.Document <> nil then
          HtmlCodeData := AnsiLowerCase(
          (Wbbr.Document as iHTMLDocument2).body.innerhtml);
          Application.ProcessMessages; (*тут вроде бы и не надо?*)
      except
          CodeSite.EnterMethod( Self, 'Timer' );
          CodeSite.SendError('TWebBrowser failed'); (*бравузер здох*)
          CodeSite.ExitMethod( Self, 'Timer' );
      end;



Вопрос: чем можно заменить Application.ProcessMessages в коде, так чтобы гарантировать загрузку страницы перед выполнением последующих инструкций
Ответить с цитированием
  #2  
Старый 27.05.2012, 12:01
wendstor wendstor вне форума
Прохожий
 
Регистрация: 13.10.2010
Сообщения: 30
Репутация: 11
По умолчанию

Вместо Application попробуй Класс TThread, вот ссылка.
а грузить проц будет так как идёт бработка html кода и построение страницы.
Ответить с цитированием
  #3  
Старый 27.05.2012, 12:16
Pcrepair
 
Сообщения: n/a
По умолчанию

потоки это хорошо, но не по теме

уже насоветовали

Код:
repeat
Sleep (1);
Application.ProcessMessages;
надо было просто приложить АПМ к чему то
теперь не более 7% загрузки проца
Ответить с цитированием
  #4  
Старый 27.05.2012, 15:40
Аватар для Bargest
Bargest Bargest вне форума
Профессионал
 
Регистрация: 19.10.2010
Адрес: Москва
Сообщения: 2,390
Версия Delphi: XE3/VS12/FASM
Репутация: 14665
По умолчанию

Sleep можно и больше 1 миллисекунды сделать. Загрузка снизится почти до нуля.
__________________
jmp $ ; Happy End!
The Cake Is A Lie.
Ответить с цитированием
  #5  
Старый 27.05.2012, 19:08
Аватар для NumLock
NumLock NumLock вне форума
Let Me Show You
 
Регистрация: 30.04.2010
Адрес: Северодвинск
Сообщения: 5,426
Версия Delphi: 7, XE5
Репутация: 59586
По умолчанию

а чем события не устраивают?
__________________
Пишу программы за еду.
__________________
Ответить с цитированием
  #6  
Старый 28.05.2012, 16:25
Pcrepair
 
Сообщения: n/a
По умолчанию

OnDownloadComplete и прочие не походят, так как нет гарантии что они возникают после закачки и обработки страницы

код в топике гарантирует, в том числе и в ситуации с низкой скоростью закачки, правильную обработку кода(ДОМ). это проверено
Ответить с цитированием
  #7  
Старый 28.05.2012, 17:00
Аватар для NumLock
NumLock NumLock вне форума
Let Me Show You
 
Регистрация: 30.04.2010
Адрес: Северодвинск
Сообщения: 5,426
Версия Delphi: 7, XE5
Репутация: 59586
По умолчанию

даже в справке написано:
Цитата:
This example shows how to detect when a document is completely loaded, even if it includes multiple frames. Only the final OnDocumentComplete event passes the same Dispatch interface as the OnNavigateComplete event handler.

var

CurDispatch: IDispatch; {save the interface globally }

procedure TForm1.WebBrowser1NavigateComplete2(Sender: TObject; const pDisp: IDispatch; var URL: OleVariant);

begin
if CurDispatch = nil then
CurDispatch := pDisp; { save for comparison }
end;
procedure TForm1.WebBrowser1DocumentComplete(Sender: TObject; const pDisp: IDispatch; var URL: OleVariant);
begin
if (pDisp = CurDispatch) then
begin
Beep; {the document is loaded, not just a frame }
CurDispatch := nil; {clear the global variable }
end;
end;

на худой конец:

Код:
  WebBrowser1.OnDocumentComplete:=WebBrowser1DocumentComplete;
  WebBrowser1.Navigate('http://www.sony-ericsson.ru/forums2/index.php');

procedure TForm1.WebBrowser1DocumentComplete(Sender: TObject;
  const pDisp: IDispatch; var URL: OleVariant);
begin
  if WebBrowser1.ReadyState=READYSTATE_COMPLETE then Caption:='Ok';
end;
__________________
Пишу программы за еду.
__________________

Последний раз редактировалось NumLock, 28.05.2012 в 17:07.
Ответить с цитированием
  #8  
Старый 28.05.2012, 17:31
Pcrepair
 
Сообщения: n/a
По умолчанию

справочник - это хорошо
а сам не пробовал? if Wbbr.OnDocumentComplete = True Then .... в своих программах?
а то опять прийдется полдня тестировать
Ответить с цитированием
  #9  
Старый 28.05.2012, 17:34
Аватар для NumLock
NumLock NumLock вне форума
Let Me Show You
 
Регистрация: 30.04.2010
Адрес: Северодвинск
Сообщения: 5,426
Версия Delphi: 7, XE5
Репутация: 59586
По умолчанию

событие OnDocumentComplete типа TWebBrowserDocumentComplete:
Код:
TWebBrowserDocumentComplete = procedure(Sender: TObject; const pDisp: IDispatch; var URL: OleVariant) of object;
сравнивать его с True нельзя.
__________________
Пишу программы за еду.
__________________
Ответить с цитированием
  #10  
Старый 28.05.2012, 18:41
Pcrepair
 
Сообщения: n/a
По умолчанию

ну хорошо нельзя сравнивать.....
речь то не об этом
речь о том, есть ли у тебя личный опыт использования этого кода и с какими результатами

тот код что приведен в топике хотя бы проверен и проблем замечено не было
Ответить с цитированием
Ответ


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 21:57.


 

Сайт

Форум

FAQ

Соглашения

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2025