Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Общие вопросы > Ожидание загрузки страницы


Автор: JanMihail 31.5.2007, 21:00
Уважаемые мастера! Помогите справится с такой задачей. Мне нужно организовать задержку программы до тех пор, пока не загрузится страница в компоненте TWebBrowser. Делаю так:

Код

procedure Start;
label Nachalo;
begin
Nachalo:
 //тут много кода
 ........................
 while WebBrowser1.ReadyState <> 4 do
   Application.ProcessMessages;

 WebBrowser1.Navigate('новая страница');
 goto Nachalo;
end;


Но такой цикл очень сильно грузит процессор. Но проблема еще в том что после первого прохода процедуры все нормально. Параметр ReadyState становится равным 4, дальше я назначаю WebBrowserу новую страницу. Иду в начало, а цикл не выполняется, т.к. параметр ReadyState еще не успел поменять свое значение с 4 на 1, а цикл уже прошел и ожижать загрузки он не стал.
Не подскажете, как вообще это реализовать рационально?. Заранее спасибо!!!

Автор: sw04 31.5.2007, 21:27
JanMihail, зачем метку используешь?
не лучше саму процедуру вызывать?

Как вариант можно использовать потоки.

Автор: JanMihail 31.5.2007, 21:36
Цитата

Зачем метку используешь

но мне не нужно каждый раз процедуру сначала выполнять. А именно с этой метки. Перед меткой еще код есть!
Код

procedure Start;
label Nachalo;
begin
//тут много кода
 ........................
Nachalo:
 //тут много кода
 ........................
 while WebBrowser1.ReadyState <> 4 do
   Application.ProcessMessages;

 WebBrowser1.Navigate('новая страница');
 goto Nachalo;
end;

Автор: sw04 31.5.2007, 22:18
Код

type
...
TSnifferThread = class(TThread)
  private
  protected
      procedure Execute; override;
      procedure Init; virtual;
  public
  end;

TfrmMain = class(TForm)
...
  private
  FSnifferThread: TSnifferThread;
...

procedure TSnifferThread.Init;
begin
if FSnifferThread <> nil then
  begin
     FSnifferThread.Terminate;
    FSnifferThread := nil;
  end
else
  begin
     FSnifferThread := TSnifferThread.Create(True);
     FSnifferThread.FreeOnTerminate := True;
     FSnifferThread.Resume;
  end;
end;

procedure TSnifferThread.Execute;
begin
  while not Terminate do
    if WebBrowser1.ReadyState = 4 then
      begin
      //делаем что надо при окончательной загрузке страницы
      FSnifferThread.Suspend;
     end;

end;


так вот, когда тебе надо проверить ReadyState, необходимо вызвать процедуру  FSnifferThread.Init. Код работает, но коряво скорее всего. Надо учитывать запуск и остановку потока.

Автор: MetalFan 31.5.2007, 22:50
ойй... гото то зачем???

Автор: aktuba 1.6.2007, 00:55
Цитата

ойй... гото то зачем???


В память о прежних временах  smile 


JanMihail, раз у тебя такая проблема - это говорит только об одном - неверный подход к структуре программы. Правильнее было бы использование менеджера, который будет распоряжаться переходами по линкам и, возможно, отдельный поток. Ну и конечно (!!!) - надо отказаться от Goto!!!

Автор: JanMihail 1.6.2007, 07:33
Цитата

Дата 31.5.2007, 22:18 

Ну такой цикл же грузит процессор! Мне надо чтоб ожидание не в цикле как-то было

Автор: sw04 1.6.2007, 19:03
Цитата(JanMihail @ 1.6.2007,  10:33)
Цитата

Дата 31.5.2007, 22:18 

Ну такой цикл же грузит процессор! Мне надо чтоб ожидание не в цикле как-то было

не, зачем.
если на потоках, то всё нормально будет.
советую ознакомиться с закрепленной статьей в разделе win api - сабклассинг и суперклассинг.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)